距离详解Linux下的UDP方式通讯
UDP方式点对点通讯
#include<stdio.h> #include<string.h> #include<sys/types.h> #include<netinet/in.h> #include<sys/socket.h> #include<errno.h> #include<stdlib.h> #include<arpa/inet.h> intmain(intargc,char**argv) { structsockaddr_ins_addr; structsockaddr_inc_addr; intsock; socklen_taddr_len; intlen; charbuff[128]; /*创建socket,关键在于这个SOCK_DGRAM*/ if((sock=socket(AF_INET,SOCK_DGRAM,0))==-1){ perror("socket"); exit(errno); }else printf("createsocket.\n\r"); memset(&s_addr,0,sizeof(structsockaddr_in)); /*设置地址和端口信息*/ s_addr.sin_family=AF_INET; if(argv[2]) s_addr.sin_port=htons(atoi(argv[2])); else s_addr.sin_port=htons(7838); if(argv[1]) s_addr.sin_addr.s_addr=inet_addr(argv[1]); else s_addr.sin_addr.s_addr=INADDR_ANY; /*绑定地址和端口信息*/ if((bind(sock,(structsockaddr*)&s_addr,sizeof(s_addr)))==-1){ perror("bind"); exit(errno); }else printf("bindaddresstosocket.\n\r"); /*循环接收数据*/ addr_len=sizeof(c_addr); while(1){ len=recvfrom(sock,buff,sizeof(buff)-1,0, (structsockaddr*)&c_addr,&addr_len); if(len<0){ perror("recvfrom"); exit(errno); } buff[len]='\0'; printf("收到来自%s:%d的消息:%s\n\r", inet_ntoa(c_addr.sin_addr),ntohs(c_addr.sin_port),buff); } return0; }
客户端源代码如下:
#include<stdio.h> #include<string.h> #include<sys/types.h> #include<netinet/in.h> #include<sys/socket.h> #include<errno.h> #include<stdlib.h> #include<arpa/inet.h> intmain(intargc,char**argv) { structsockaddr_ins_addr; intsock; intaddr_len; intlen; charbuff[128]; /*创建socket,关键在于这个SOCK_DGRAM*/ if((sock=socket(AF_INET,SOCK_DGRAM,0))==-1){ perror("socket"); exit(errno); }else printf("createsocket.\n\r"); /*设置对方地址和端口信息*/ s_addr.sin_family=AF_INET; if(argv[2]) s_addr.sin_port=htons(atoi(argv[2])); else s_addr.sin_port=htons(7838); if(argv[1]) s_addr.sin_addr.s_addr=inet_addr(argv[1]); else{ printf("消息必须有一个接收者!\n"); exit(0); } /*发送UDP消息*/ addr_len=sizeof(s_addr); strcpy(buff,"helloi'mhere"); len=sendto(sock,buff,strlen(buff),0, (structsockaddr*)&s_addr,addr_len); if(len<0){ printf("\n\rsenderror.\n\r"); return3; } printf("sendsuccess.\n\r"); return0; }
编译程序用下列命令:
gcc-Wallsimple-udpserver.c-oserver gcc-Wallsimple-udpclient.c-oclient
运行程序用下列命令:
./server127.0.0.17838 ./client127.0.0.17838
UDP方式广播通讯
源代码变成下面的:
#include<stdio.h> #include<string.h> #include<sys/types.h> #include<netinet/in.h> #include<sys/socket.h> #include<errno.h> #include<stdlib.h> #include<arpa/inet.h> intmain(intargc,char**argv) { structsockaddr_ins_addr; intsock; intaddr_len; intlen; charbuff[128]; intyes; /*创建socket*/ if((sock=socket(AF_INET,SOCK_DGRAM,0))==-1){ perror("socket"); exit(errno); }else printf("createsocket.\n\r"); /*设置通讯方式对广播,即本程序发送的一个消息,网络上所有主机均可以收到*/ yes=1; setsockopt(sock,SOL_SOCKET,SO_BROADCAST,&yes,sizeof(yes)); /*唯一变化就是这一点了*/ /*设置对方地址和端口信息*/ s_addr.sin_family=AF_INET; if(argv[2]) s_addr.sin_port=htons(atoi(argv[2])); else s_addr.sin_port=htons(7838); if(argv[1]) s_addr.sin_addr.s_addr=inet_addr(argv[1]); else{ printf("消息必须有一个接收者!\n"); exit(0); } /*发送UDP消息*/ addr_len=sizeof(s_addr); strcpy(buff,"helloi'mhere"); len=sendto(sock,buff,strlen(buff),0, (structsockaddr*)&s_addr,addr_len); if(len<0){ printf("\n\rsenderror.\n\r"); return3; } printf("sendsuccess.\n\r"); return0; }
编译这个程序用下列命令:
gcc-Wallbroadc-udpclient.c-oclient
运行程序用下列命令:
./client192.168.0.2557838
就会往192.168.0网络内所有主机发消息。
其它主机如果运行了服务端:
./server自己的IP地址7838
则都会收到上述客户端发的消息了。