c++ udp socket學習
阿新 • • 發佈:2018-12-05
////////////////////////////////////////////////////////////////////////// // UDPServer.cpp #include <stdio.h> #include <WINSOCK2.H> #pragma comment(lib,"WS2_32.lib") #define BUF_SIZE 64 int main(void) { WSADATA wsd; SOCKET s; int nRet; // 初始化套接字動態庫 if(WSAStartup(MAKEWORD(2,2),&wsd) != 0) { 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; } SOCKET socketSrv = socket(AF_INET,SOCK_DGRAM,0); SOCKADDR_IN addrSrv; SOCKADDR_IN addrClient; char buf[BUF_SIZE]; int len = sizeof(SOCKADDR); // 設定伺服器地址 ZeroMemory(buf,BUF_SIZE); addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY); addrSrv.sin_family = AF_INET; addrSrv.sin_port = htons(5000); // 繫結套接字 nRet = bind(socketSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR)); if(SOCKET_ERROR == nRet) { printf("bind failed !/n"); closesocket(s); WSACleanup(); return -1; } // 從客戶端接收資料 nRet = recvfrom(socketSrv,buf,BUF_SIZE,0,(SOCKADDR*)&addrClient,&len); if(SOCKET_ERROR == nRet) { printf("recvfrom failed !/n"); closesocket(s); WSACleanup(); return -1; } // 列印來自客戶端傳送來的資料 printf("Recv From Client:%s/n",buf); // 向客戶端傳送資料 sendto(socketSrv,"UDP Hello World !",sizeof("UDP Hello World !"),0,(SOCKADDR*)&addrClient,len); closesocket(s); WSACleanup(); return 0; } ////////////////////////////////////////////////////////////////////////// // UDPClient.cpp #include <stdio.h> #include <WINSOCK2.H> #pragma comment(lib,"WS2_32.lib") #define BUF_SIZE 64 int main(void) { WSADATA wsd; SOCKET s; // 初始化套接字動態庫 if(WSAStartup(MAKEWORD(2,2),&wsd) != 0) { 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; } char buf[BUF_SIZE]; // 接受資料 SOCKADDR_IN servAddr; // 伺服器套接字地址 SOCKET sockClient = socket(AF_INET,SOCK_DGRAM,0); int nRet; ZeroMemory(buf,BUF_SIZE); strcpy(buf,"UDP Hello World !"); // 設定伺服器地址 servAddr.sin_family = AF_INET; servAddr.sin_addr.S_un.S_addr = inet_addr("192.168.1.254"); servAddr.sin_port = htons(5000); // 向伺服器傳送資料 int nServAddLen = sizeof(servAddr); if(sendto(sockClient,buf,BUF_SIZE,0,(sockaddr *)&servAddr,nServAddLen) == SOCKET_ERROR) { printf("recvfrom() failed:%d/n",WSAGetLastError()); closesocket(s); WSACleanup(); return 1; } nRet = recvfrom(sockClient,buf,BUF_SIZE,0,(sockaddr *)&servAddr,&nServAddLen); if(SOCKET_ERROR == nRet) { printf("recvfrom failed !/n"); closesocket(s); WSACleanup(); return -1; } // 列印來自服務端傳送來的資料 printf("Recv From Server:%s/n",buf); closesocket(s); WSACleanup(); return 0; }