C/C++使用Socket通信UDP
接收端
1 #include <stdio.h> 2 #include <WinSock2.h> 3 4 #pragma comment(lib,"WS2_32.lib") 5 6 int main(void) 7 { 8 WSADATA wsd; // 初始化Socket的变量 9 SOCKET s; // 用于通信的Socket句柄 10 SOCKADDR_IN sRecvAddr,sSendAddr; // 分别为接收地址和发送地址 11 USHORT uPort = 1401; // 通信端口 12 CHAR szBuf[1024] = { 0 }; // 通信数据缓冲区 13 int nBufLen = 1024,nResult = 0, nSenderAddrSize = sizeof(sSendAddr); 14 15 // 初始化Socket2.2版本 16 nResult = WSAStartup(MAKEWORD(2, 2), &wsd); 17 if (nResult != NO_ERROR) 18 { 19 printf("WSAStartup failed:%d\n", WSAGetLastError()); 20 return 1; 21 } 22 23 // 创建一个Socket,SOCK_DGRAM表示UDP类型 24 s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); 25 if (s == INVALID_SOCKET) 26 { 27 printf("socket failed:%d\n", WSAGetLastError()); 28 return 1; 29 } 30 31 // 填充Socket接口 32 sRecvAddr.sin_family = AF_INET; // 地址协议,AF_INET支持TCP和UDP 33 sRecvAddr.sin_port = htons(uPort); // 通信端口,htons转为网络字节顺序 34 sRecvAddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY); // 接收任意地址数据 35 36 // 绑定Socket至本机 37 nResult = bind(s, (SOCKADDR *)&sRecvAddr, sizeof(sRecvAddr)); 38 if (nResult != 0) 39 { 40 printf("bind failed:%d\n", WSAGetLastError()); 41 return 1; 42 } 43 44 printf("Waiting recv data...\n"); 45 // 阻塞式接收数据 46 nResult = recvfrom(s, szBuf, nBufLen, 0, (SOCKADDR *)&sSendAddr, &nSenderAddrSize); 47 if (nResult == SOCKET_ERROR) 48 { 49 printf("recvfrom failed:%d\n", WSAGetLastError()); 50 } 51 else{ 52 printf("SenderIP :%s\n", inet_ntoa(sSendAddr.sin_addr)); 53 printf("SenderData:%s\n", szBuf); 54 } 55 // 关闭Socket连接 56 nResult = closesocket(s); 57 if (nResult == SOCKET_ERROR) 58 { 59 printf("closesocket failed:%d\n", WSAGetLastError()); 60 return 1; 61 } 62 // 清理Socket 63 WSACleanup(); 64 65 system("pause"); 66 return 0; 67 }
发送端
#include <stdio.h> #include <WinSock2.h> #include <Windows.h> #pragma comment(lib,"WS2_32.lib") int main(void) { WSADATA wsd; SOCKET s; if (WSAStartup(MAKEWORD(2, 2), &wsd)) { printf("WSAStartup failed!\n"); return 1; } s = socket(AF_INET, SOCK_DGRAM, 0); if (s == INVALID_SOCKET) { printf("socket failed,Error Code:%d\n", WSAGetLastError()); WSACleanup(); return 1; } SOCKADDR_IN addr; SOCKET sockClient = socket(AF_INET, SOCK_DGRAM, 0); addr.sin_family = AF_INET; addr.sin_addr.S_un.S_addr = inet_addr("172.18.0.67"); addr.sin_port = htons(1401); sendto(sockClient, "测试UDP通信!", 50, 0, (sockaddr *)&addr, 50); closesocket(s); WSACleanup(); printf("Hello World!\n"); system("pause"); return 0; }
效果图