客户端:
#include "apue.h"
#include <netdb.h>
#include <sys/socket.h>
/*
问题: UDP通信套接字描述符没有同任何地址绑定,那么在这个套接字描述符上面发送数据有什么意义 ???
是不是系统默认将其与本机地址绑定了?
答案:假如c_fd没有显式和任何本地"端口"绑定,那么内核会为其绑定一个临时"端口",
以便其可以通过该"端口"将数据发送到目的地址 !!!
>>>同Unix域套接字通信不同,这里不用显示绑定套接字和地址,服务器也能找到客户端 ~
*/
int main(void){
int c_fd;
struct sockaddr_in s_addr;
char buf[MAXLINE];
char msg[MAXLINE];
/* 建立UPD套接口,SOCK_DGRAM指明为UDP通信套接字 */
if((c_fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
printf("socket error\n");
/* 初始化服务器地址 */
s_addr.sin_family = AF_INET;
inet_pton(AF_INET,"127.0.0.1",(void *)&s_addr.sin_addr.s_addr);
s_addr.sin_port = htons(3636);
/* 向服务器发送数据 */
fgets(msg,MAXLINE,stdin);
if(sendto(c_fd,msg,strlen(msg),0,(struct sockaddr *)&s_addr,sizeof(s_addr)) < 0)
printf("send error\n");
/* 接收服务器的数据,不需要关心是谁发来的 */
if(recvfrom(c_fd,buf,MAXLINE,0,NULL,NULL) < 0)
printf("recvfrom error\n");
printf("server send: %s\n",buf);
/* 关闭套接字 */
close(c_fd);
exit(0);
}
服务器端:
#include "apue.h"
#include <netdb.h>
#include <sys/socket.h>
#include "jiq/daemon.c"
#define BUFLINE 128
#define MAXADDRLEN 256
int main(void){
int s_fd;
int len;
char buf[BUFLINE];
struct sockaddr_in s_addr; //Linux network-addr
struct sockaddr c_addr;
char *msg="I Have Got your meg\n";
/*
let this server become daemon
(1)系统自举时启动
(2)没有控制终端
(3)系统关闭时终止
(4)后台运行
*/
daemonize("server");
/* 建立UDP套接字,SOCK_DGRAM指明为UDP通信套接字 */
if((s_fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
printf("socket error\n");
/* 绑定套接字和服务器网络地址 */
s_addr.sin_family = AF_INET;
s_addr.sin_addr.s_addr = htonl(INADDR_ANY);//内核指定地址
s_addr.sin_port = htons(3636);
if(bind(s_fd,(struct sockaddr *)&s_addr,sizeof(s_addr)) < 0)
printf("bind error\n");
for(;;){
printf("\nwaiting for ask...\n");
/* 接收数据,并记下是谁发来的 */
if(recvfrom(s_fd,buf,BUFLINE,0,&c_addr,&len) < 0)
printf("recvfrom error\n");
/* 向客户端发送数据 */
if(sendto(s_fd,msg,strlen(msg),0,&c_addr,len) < 0)
printf("sendto error\n");
printf("client send: %s",buf);
memset(buf,0,MAXLINE); //clear buf
}
/* 关闭套接字 */
close(s_fd);
exit(0);
}