Linux中使用C语言实现基于UDP协议的Socket通信示例
发布时间:2020-12-16 05:33:05 所属栏目:百科 来源:网络整理
导读: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/s
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> int main(int argc,char **argv) { printf("server ip: %s/n",argv[1]); printf("server port: %s/n",argv[2]); printf("/n service starting.../n/n"); int socketFd; struct sockaddr_in svrAddr; struct sockaddr_in localAddr; socketFd = socket (AF_INET,SOCK_DGRAM,0); if ( -1 == socketFd ) { perror( "socket:" ); exit(-1); } // 设置地址可复用 int option = 1; setsockopt( socketFd,SOL_SOCKET,SO_REUSEADDR,&option,sizeof(option) ); // 客户端IP memset(&localAddr,sizeof(localAddr)); localAddr.sin_family = AF_INET; localAddr.sin_addr.s_addr = inet_addr( argv[1]); localAddr.sin_port = htons (atoi(argv[2])); int bindResult = bind(socketFd,(struct sockaddr *) &localAddr,sizeof(localAddr)); if ( -1 == bindResult ) { perror( "bind:" ); close(socketFd); exit(-1); } // 服务器IP memset(&svrAddr,sizeof(svrAddr)); svrAddr.sin_family = AF_INET; svrAddr.sin_addr.s_addr = inet_addr( argv[1]); svrAddr.sin_port = htons (atoi(argv[2])); char tempBuff[2048] = {0}; for ( ; ; ) { // 接收数据 struct sockaddr_in fromAddr; memset((char *)&fromAddr,(int)sizeof(fromAddr)); socklen_t fromLen = sizeof(fromAddr); ssize_t result = recvfrom( socketFd,tempBuff,sizeof(tempBuff),(struct sockaddr *)&fromAddr,&fromLen); if ( -1 == result ) { perror("recvfrom:"); continue; } else { printf( "recv data %s successed. data len: %d/n",inet_ntoa(fromAddr.sin_addr),result ); printf( "data:/n"); for ( int i = 0; i < result; i++ ) { printf( "%02x ",tempBuff[i] ); if ( (i+1)%16 == 0 ) { printf( "/n" ); } } printf( "/n" ); } // 发送数据 result = sendto( socketFd,result,(struct sockaddr*)&fromAddr,sizeof(fromAddr)); if ( -1 == result ) { perror("sendto:"); } else { printf("send data success. data len:%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> typedef struct _NSS_HEADER { unsigned short ProtocolVersion; /* 协议版本信息 */ unsigned short MsgType; /* 消息类型 */ unsigned short TransactionNo; /* 传输编号 */ unsigned short PacketLength; /* 数据包长度,包括Header */ }NSS_HEADER; int main(int argc,char **argv) { printf("client ip: %s/n",argv[1]); printf("client port: %s/n",argv[2]); printf("server ip: %s/n",argv[3]); printf("server port: %s/n",argv[4]); printf("/n service starting.../n/n"); int socketFd; struct sockaddr_in svrAddr; struct sockaddr_in localAddr; socketFd = socket (AF_INET,sizeof(localAddr)); if ( -1 == bindResult ) { perror( "bind:" ); sleep(10); close(socketFd); exit(-1); } // 服务器IP memset(&svrAddr,sizeof(svrAddr)); svrAddr.sin_family = AF_INET; svrAddr.sin_addr.s_addr = inet_addr( argv[3]); svrAddr.sin_port = htons (atoi(argv[4])); char tempBuff[2048] = {0}; // 每分钟发送一次数据 NSS_HEADER hdr; memset( &hdr,sizeof(NSS_HEADER)); for ( ; ; ) { // 发送数据 hdr.TransactionNo++; ssize_t result = sendto( socketFd,&hdr,sizeof(NSS_HEADER),(struct sockaddr*)&svrAddr,sizeof(svrAddr)); if ( -1 == result ) { perror("sendto:"); } else { printf("send data success. data len:%d/n",result ); } // 接收数据 struct sockaddr_in fromAddr; memset((char *)&fromAddr,(int)sizeof(fromAddr)); socklen_t fromLen = sizeof(fromAddr); result = recvfrom( socketFd,&fromLen); if ( -1 == result ) { perror("recvfrom:"); } else { printf( "recv data %s successed. data len: %d/n",tempBuff[i] ); if ( (i+1)%16 == 0 ) { printf( "/n" ); } } printf("/n"); } sleep( 60 ); } close(socketFd); } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |