Linux中使用C語言實現(xiàn)基于UDP協(xié)議的Socket通信示例
更新時間:2016年03月22日 18:03:36 作者:hncdsun
這篇文章主要介紹了Linux中使用C語言實現(xiàn)基于UDP協(xié)議的socket通信示例,服務(wù)器端與客戶端的功能都非?;A(chǔ),需要的朋友可以參考下
linux下udp服務(wù)器端源碼示例:
#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); } // 設(shè)置地址可復(fù)用 int option = 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])); int bindResult = bind(socketFd, (struct sockaddr *) &localAddr, sizeof(localAddr)); if ( -1 == bindResult ) { perror( "bind:" ); close(socketFd); exit(-1); } // 服務(wù)器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])); char tempBuff[2048] = {0}; for ( ; ; ) { // 接收數(shù)據(jù) struct sockaddr_in fromAddr; memset((char *)&fromAddr, 0, (int)sizeof(fromAddr)); socklen_t fromLen = sizeof(fromAddr); ssize_t result = recvfrom( socketFd, tempBuff, sizeof(tempBuff), 0, (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" ); } // 發(fā)送數(shù)據(jù) result = sendto( socketFd, tempBuff, result, 0, (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; /* 協(xié)議版本信息 */ unsigned short MsgType; /* 消息類型 */ unsigned short TransactionNo; /* 傳輸編號 */ unsigned short PacketLength; /* 數(shù)據(jù)包長度,包括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, SOCK_DGRAM, 0); if ( -1 == socketFd ) { perror( "socket:" ); exit(-1); } // 設(shè)置地址可復(fù)用 int option = 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])); int bindResult = bind(socketFd, (struct sockaddr *) &localAddr, sizeof(localAddr)); if ( -1 == bindResult ) { perror( "bind:" ); sleep(10); close(socketFd); exit(-1); } // 服務(wù)器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])); char tempBuff[2048] = {0}; // 每分鐘發(fā)送一次數(shù)據(jù) NSS_HEADER hdr; memset( &hdr, 0, sizeof(NSS_HEADER)); for ( ; ; ) { // 發(fā)送數(shù)據(jù) hdr.TransactionNo++; ssize_t result = sendto( socketFd, &hdr, sizeof(NSS_HEADER), 0, (struct sockaddr*)&svrAddr, sizeof(svrAddr)); if ( -1 == result ) { perror("sendto:"); } else { printf("send data success. data len:%d/n", result ); } // 接收數(shù)據(jù) struct sockaddr_in fromAddr; memset((char *)&fromAddr, 0, (int)sizeof(fromAddr)); socklen_t fromLen = sizeof(fromAddr); result = recvfrom( socketFd, tempBuff, sizeof(tempBuff), 0, (struct sockaddr *)&fromAddr, &fromLen); if ( -1 == result ) { perror("recvfrom:"); } 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"); } sleep( 60 ); } close(socketFd); }
相關(guān)文章
C++實現(xiàn)通訊錄管理系統(tǒng)設(shè)計
這篇文章主要為大家詳細(xì)介紹了C++實現(xiàn)通訊錄管理系統(tǒng)設(shè)計,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-06-06Qt圖形圖像開發(fā)之QT滾動區(qū)控件(滾動條)QScrollArea的詳細(xì)方法用法圖解與實例
這篇文章主要介紹了Qt圖形圖像開發(fā),QT滾動區(qū)控件(滾動條)QScrollArea的詳細(xì)方法用法圖解與實例,需要的朋友可以參考下2020-03-03