socket——UDP服务器
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了socket——UDP服务器相关的知识,希望对你有一定的参考价值。
UDP在socket编程中和TCP的不同
UDP是无连接的传输,因此并不需要建立连接,不需要监听是否有客户端发送连接请求(具体到socket编程中即UDP不需要listen()和accept())
UDP采用面向数据报方式(socket()的第二个参数是SOCK_DGRAM)
UDP可能会丢包,也不保证数据顺序性(QQ上有时候消息在发送端和接收端的顺序不一样)
UDP收发数据用sendto/recvfrom函数,每次sendto/recvfrom均需指定地址信息(这一点TCP服务器中在connect/accept时确定)
UDP shutdown函数无效
服务器端程序:
#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; }
客户端程序:
#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]; //remote保存远端服务器的信息 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; }
服务器端运行结果:
运行了3个客户端结果:
本文出自 “零蛋蛋” 博客,请务必保留此出处http://lingdandan.blog.51cto.com/10697032/1782116
以上是关于socket——UDP服务器的主要内容,如果未能解决你的问题,请参考以下文章