socket编程之----UDP服务器
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了socket编程之----UDP服务器相关的知识,希望对你有一定的参考价值。
与面向连接的协议相比,面向无连接协议极为不同。其中一个重要的不同点就是客户端与服务器之间不必建立连接。
对于UDP套接字编程而言,服务器创建套接字后,调用bind()函数将套接字与准备接收数据的接口绑定在一起。和TCP编程不同的是,应用程序不必调用 listen()和accept()函数等待客户端的连接。而只需要等待接收数据了。开发UDP套接字应用程序,有两个重要的函数sendto()和 recvfrom()。服务器采用recvfrom()来接收来自客户端的数据报,并获得客户端的端地址,之后向客户端发送数据时,采用sendto() 函数。
下面是一个简单的UDP服务器的实现:
//udp_server.c
#include<stdio.h> #include<string.h> #include<sys/types.h> #include<sys/socket.h> #include<arpa/inet.h> #include<netinet/in.h> void usage(char *proc) { printf("%s [ip] [port]\n",proc); } int main(int argc,char *argv[]) { if(argc != 3) { usage(argv[0]); return 1; } int sock=socket(AF_INET,SOCK_DGRAM,0); if(sock<0) { perror("socket"); return 1; } int _port=atoi(argv[2]); char *_ip=argv[1]; struct sockaddr_in local; local.sin_family=AF_INET; local.sin_port=htons(_port); local.sin_addr.s_addr=inet_addr(_ip); if(bind(sock,(struct sockaddr*)&local,sizeof(local))<0) { perror("bind"); return 2; } char buf[1024]; struct sockaddr_in client; socklen_t client_len; while(1) { ssize_t _size=recvfrom(sock,buf,sizeof(buf)-1,0,(struct sockaddr*)&client,&client_len); if(_size<0) { perror("recvfrom"); } else if(_size == 0) { printf("client shutdown ... \n"); } else { printf("client >> %s",buf); } } return 0; }
//udp_client.c
#include<stdio.h> #include<string.h> #include<sys/types.h> #include<sys/socket.h> #include<arpa/inet.h> #include<netinet/in.h> void usage(char *proc) { printf("%s [ip] [port] \n",proc); } int main(int argc,char *argv[]) { if(argc != 3) { usage(argv[0]); return 1; } int sock=socket(AF_INET,SOCK_DGRAM,0); if(sock<0) { perror("socket"); return 2; } int _port=atoi(argv[2]); char *_ip=argv[1]; struct sockaddr_in remote; remote.sin_family=AF_INET; remote.sin_port=htons(_port); remote.sin_addr.s_addr=inet_addr(_ip); socklen_t remote_len=sizeof(remote); char buf[1024]; while(1) { printf("Please Enter >> "); fgets(buf,sizeof(buf),stdin); ssize_t _size=sendto(sock,buf,sizeof(buf)-1,0,(struct sockaddr*)&remote,remote_len); if(_size<0) { perror("sendto"); } } return 0; }
运行结果:
本文出自 “无心” 博客,请务必保留此出处http://760470897.blog.51cto.com/10696844/1794453
以上是关于socket编程之----UDP服务器的主要内容,如果未能解决你的问题,请参考以下文章