轉載
C++ UDP客戶端服務器Socket編程
UDPServer.cpp
#include<winsock2.h> #include<stdio.h> #include<string.h> #include<iostream> using namespace std; #pragma comment(lib,"ws2_32.lib") #define BUFFER_SIZE 1024 int main() { WSADATA WSAData; char receBuf[BUFFER_SIZE]; char Response[] = ""; if (WSAStartup(MAKEWORD(2, 2), &WSAData) != 0) { printf("初始化失敗"); exit(1); } SOCKET sockServer = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); if (sockServer == INVALID_SOCKET) { printf("Failed socket() \n"); return 0; } SOCKADDR_IN addr_Server; //服務器的地址等信息 addr_Server.sin_family = AF_INET; addr_Server.sin_port = htons(4567); addr_Server.sin_addr.S_un.S_addr = INADDR_ANY; if (bind(sockServer, (SOCKADDR*)&addr_Server, sizeof(addr_Server)) == SOCKET_ERROR) { //服務器與本地地址綁定 printf("Failed socket() %d \n", WSAGetLastError()); return 0; } SOCKADDR_IN addr_Clt; int fromlen = sizeof(SOCKADDR); while (true) { int last = recvfrom(sockServer, receBuf, 1024, 0, (SOCKADDR*)&addr_Clt, &fromlen); if (last>0) { //判斷接收到的數據是否為空 receBuf[last] = '\0';//給字符數組加一個'\0',表示結束了。不然輸出有亂碼 if (strcmp(receBuf, "bye") == 0) { cout << " 客戶端不跟我聊天了..." << endl; closesocket(sockServer); return 0; } else { printf("接收到數據(%s):%s\n", inet_ntoa(addr_Clt.sin_addr), receBuf); } } cout << "回復客戶端消息:"; cin >> Response; //給客戶端回復消息 sendto(sockServer, Response, strlen(Response), 0, (SOCKADDR*)&addr_Clt, sizeof(SOCKADDR)); } closesocket(sockServer); WSACleanup(); return 0; }
UDPClient.cpp
#include<winsock2.h> #include<stdio.h> #include<string.h> #include<iostream> using namespace std; #pragma comment(lib,"ws2_32.lib") # define BUFFER_SIZE 1024 //緩沖區大小 int main() { SOCKET sock_Client; //客戶端用於通信的Socket WSADATA WSAData; char receBuf[BUFFER_SIZE]; //發送數據的緩沖區 char sendBuf[BUFFER_SIZE]; //接受數據的緩沖區 if (WSAStartup(MAKEWORD(2, 2), &WSAData) != 0) { printf("初始化失敗!"); return -1; } //初始化 sock_Client = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);//創建客戶端用於通信的Socket SOCKADDR_IN addr_server; //服務器的地址數據結構 addr_server.sin_family = AF_INET; addr_server.sin_port = htons(4567);//端口號為4567 addr_server.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); //127.0.0.1為本電腦IP地址 SOCKADDR_IN sock; int len = sizeof(sock); while (true) { cout << "請輸入要傳送的數據:"; cin >> sendBuf; sendto(sock_Client, sendBuf, strlen(sendBuf), 0, (SOCKADDR*)&addr_server, sizeof(SOCKADDR)); //int last=recv(sock_Client, receBuf, strlen(receBuf), 0); // (調用recv和recvfrom都可以) int last = recvfrom(sock_Client, receBuf, strlen(receBuf), 0, (SOCKADDR*)&sock, &len); if (last>0) { receBuf[last] = '\0'; //給字符數組加一個'\0',表示結束了。不然輸出有亂碼 if (strcmp(receBuf, "bye") == 0) { cout << "服務器不跟我聊天了..." << endl;//當服務器發來bye時,關閉socket closesocket(sock_Client); break; } else { printf("接收到數據:%s\n", receBuf); } } } closesocket(sock_Client); WSACleanup(); return 0; }