基于UDP的编程
前提:基于Linux系统的学习
服务器端编程模型
1 socket(2) 创建通讯端点,返回一个文件描述符fd
2 bind(2) 将fd绑定到本地的地址和端口
while(1){
阻塞等待客户端请求数据的到来 recvfrom(2)
业务处理
将处理结果发送给客户端sendto(2)
}
#include <stdio.h> #include <sys/types.h> /* See NOTES */ #include <sys/socket.h> #include <string.h> #include <arpa/inet.h> int main(){ char IP[128]; char buf[128]; struct sockaddr_in serv; struct sockaddr_in clie; socklen_t clie_len; //创建socket通讯端口,fd int fd=socket(AF_INET,SOCK_DGRAM,0); if(fd==-1){ perror("socket"); return -1; } //初始化serv的成员 serv.sin_family=AF_INET; serv.sin_port=htons(7007); serv.sin_addr.s_addr=htonl(INADDR_ANY); //将fd绑定到服务器 int b=bind(fd,(struct sockaddr*)&serv,sizeof(serv)); if(b==-1){ perror("bind"); return -1; } while(1){ clie_len=sizeof(clie); //阻塞等待客户端的请求 ssize_t s=recvfrom(fd,&buf,128,0,(struct sockaddr*)&clie,&clie_len); if(s==-1){ perror("recvfrom"); return -1; } printf("%s\n", inet_ntop(AF_INET,&clie.sin_addr,IP,128)); write(1,buf,s); strcpy(buf,"gunk you\n"); //将处理结果发送给客户端 sendto(fd,buf,strlen(buf),0,(struct sockaddr*)&clie,sizeof(clie)); } close(fd); }
客户端编程模型
1 创建通讯端点,返回一个文件描述符fd
2 使用fd向服务器发送消息
3 阻塞等待服务器的响应消息
4 将得到的消息处理
5 关闭fd.
#include <stdio.h> #include <sys/types.h> #include <sys/socket.h> #include <string.h> #include <arpa/inet.h> int main(){ char buf[128]; struct sockaddr_in serv; char* msg="hector client\n"; //创建通讯端口,fd int fd=socket(AF_INET,SOCK_DGRAM,0); if(fd==-1){ perror("socket"); return -1; } //初始化serv的成员 serv.sin_family=AF_INET; serv.sin_port=htons(7007); inet_pton(AF_INET,"127.0.0.1",&serv.sin_addr); //使用fd向服务器发送消息 sendto(fd,msg,strlen(msg),0,\ (struct sockaddr*)&serv,sizeof(serv)); //阻塞等待服务器的响应 ssize_t r=recvfrom(fd,buf,128,0,NULL,NULL); if(r==-1){ perror("recvfrom"); return -1; } //将得到的消息处理 write(1,buf,r); //关闭fd close(fd); return 0; }