客户端:
#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); }