Linux中使用C语言实现基于UDP协议的Socket通信示例
linux下udp服务器端源码示例:
#include<errno.h> #include<sys/socket.h> #include<netinet/in.h> #include<arpa/inet.h> #include<stdlib.h> #include<string.h> #include<netinet/in.h> #include<stdio.h> #include<unistd.h> #include<sys/types.h> #include<sys/socket.h> intmain(intargc,char**argv) { printf("serverip:%s/n",argv[1]); printf("serverport:%s/n",argv[2]); printf("/nservicestarting.../n/n"); intsocketFd; structsockaddr_insvrAddr; structsockaddr_inlocalAddr; socketFd=socket(AF_INET,SOCK_DGRAM,0); if(-1==socketFd) { perror("socket:"); exit(-1); } //设置地址可复用 intoption=1; setsockopt(socketFd,SOL_SOCKET,SO_REUSEADDR,&option,sizeof(option)); //客户端IP memset(&localAddr,0,sizeof(localAddr)); localAddr.sin_family=AF_INET; localAddr.sin_addr.s_addr=inet_addr(argv[1]); localAddr.sin_port=htons(atoi(argv[2])); intbindResult=bind(socketFd,(structsockaddr*)&localAddr,sizeof(localAddr)); if(-1==bindResult) { perror("bind:"); close(socketFd); exit(-1); } //服务器IP memset(&svrAddr,0,sizeof(svrAddr)); svrAddr.sin_family=AF_INET; svrAddr.sin_addr.s_addr=inet_addr(argv[1]); svrAddr.sin_port=htons(atoi(argv[2])); chartempBuff[2048]={0}; for(;;) { //接收数据 structsockaddr_infromAddr; memset((char*)&fromAddr,0,(int)sizeof(fromAddr)); socklen_tfromLen=sizeof(fromAddr); ssize_tresult=recvfrom(socketFd,tempBuff,sizeof(tempBuff),0,(structsockaddr*)&fromAddr,&fromLen); if(-1==result) { perror("recvfrom:"); continue; } else { printf("recvdata%ssuccessed.datalen:%d/n",inet_ntoa(fromAddr.sin_addr),result); printf("data:/n"); for(inti=0;i<result;i++) { printf("%02x",tempBuff[i]); if((i+1)%16==0) { printf("/n"); } } printf("/n"); } //发送数据 result=sendto(socketFd,tempBuff,result,0,(structsockaddr*)&fromAddr,sizeof(fromAddr)); if(-1==result) { perror("sendto:"); } else { printf("senddatasuccess.datalen:%d/n",result); } sleep(60); } close(socketFd); }
linux下udp客户端源码示例:
#include<errno.h> #include<sys/socket.h> #include<netinet/in.h> #include<arpa/inet.h> #include<stdlib.h> #include<string.h> #include<netinet/in.h> #include<stdio.h> #include<unistd.h> #include<sys/types.h> #include<sys/socket.h> typedefstruct_NSS_HEADER { unsignedshortProtocolVersion;/*协议版本信息*/ unsignedshortMsgType;/*消息类型*/ unsignedshortTransactionNo;/*传输编号*/ unsignedshortPacketLength;/*数据包长度,包括Header*/ }NSS_HEADER; intmain(intargc,char**argv) { printf("clientip:%s/n",argv[1]); printf("clientport:%s/n",argv[2]); printf("serverip:%s/n",argv[3]); printf("serverport:%s/n",argv[4]); printf("/nservicestarting.../n/n"); intsocketFd; structsockaddr_insvrAddr; structsockaddr_inlocalAddr; socketFd=socket(AF_INET,SOCK_DGRAM,0); if(-1==socketFd) { perror("socket:"); exit(-1); } //设置地址可复用 intoption=1; setsockopt(socketFd,SOL_SOCKET,SO_REUSEADDR,&option,sizeof(option)); //客户端IP memset(&localAddr,0,sizeof(localAddr)); localAddr.sin_family=AF_INET; localAddr.sin_addr.s_addr=inet_addr(argv[1]); localAddr.sin_port=htons(atoi(argv[2])); intbindResult=bind(socketFd,(structsockaddr*)&localAddr,sizeof(localAddr)); if(-1==bindResult) { perror("bind:"); sleep(10); close(socketFd); exit(-1); } //服务器IP memset(&svrAddr,0,sizeof(svrAddr)); svrAddr.sin_family=AF_INET; svrAddr.sin_addr.s_addr=inet_addr(argv[3]); svrAddr.sin_port=htons(atoi(argv[4])); chartempBuff[2048]={0}; //每分钟发送一次数据 NSS_HEADERhdr; memset(&hdr,0,sizeof(NSS_HEADER)); for(;;) { //发送数据 hdr.TransactionNo++; ssize_tresult=sendto(socketFd,&hdr,sizeof(NSS_HEADER),0,(structsockaddr*)&svrAddr,sizeof(svrAddr)); if(-1==result) { perror("sendto:"); } else { printf("senddatasuccess.datalen:%d/n",result); } //接收数据 structsockaddr_infromAddr; memset((char*)&fromAddr,0,(int)sizeof(fromAddr)); socklen_tfromLen=sizeof(fromAddr); result=recvfrom(socketFd,tempBuff,sizeof(tempBuff),0,(structsockaddr*)&fromAddr,&fromLen); if(-1==result) { perror("recvfrom:"); } else { printf("recvdata%ssuccessed.datalen:%d/n",inet_ntoa(fromAddr.sin_addr),result); printf("data:/n"); for(inti=0;i<result;i++) { printf("%02x",tempBuff[i]); if((i+1)%16==0) { printf("/n"); } } printf("/n"); } sleep(60); } close(socketFd); }