windows下的網路程式設計實現
阿新 • • 發佈:2018-12-13
下面是一個簡單的windows下的服務端和客戶端的實現程式碼需要注意的是
1、此程式設計實現的只是最簡單的網路通訊,不支援多程序和多執行緒的併發(網上找到很多過於多程序和多執行緒併發的伺服器端設計,不過都是在linux下的,在windows下的建立程序和執行緒的函式不熟悉,也沒怎麼看懂,後期繼續學習)
2、獲取到來自客戶端的資料後,伺服器端將資料改成大寫傳回客戶端
3、測試只需要同時開啟伺服器端和客戶端的.exe檔案即可
伺服器端:
#include <stdio.h> #include "winsock2.h" #include <algorithm> #include <iostream> #pragma comment(lib,"WS2_32") void main() { std::cout << "啟動server端........." << std::endl; // Initialize Winsock. WSADATA wsaData; int iResult = WSAStartup(MAKEWORD(2, 2), &wsaData); if (iResult != NO_ERROR) printf("Error at WSAStartup()\n"); // Create a socket. SOCKET m_socket; m_socket = socket(AF_INET, SOCK_STREAM, 0); if (m_socket == INVALID_SOCKET) { printf("Error at socket(): %ld\n", WSAGetLastError()); WSACleanup(); return; } // Bind the socket. sockaddr_in service; service.sin_family = AF_INET; service.sin_addr.s_addr = inet_addr("127.0.0.1"); service.sin_port = htons(27015); if (bind(m_socket, (SOCKADDR*)&service, sizeof(service)) == SOCKET_ERROR) { printf("bind() failed.\n"); closesocket(m_socket); return; } // Listen on the socket. if (listen(m_socket, 1) == SOCKET_ERROR) printf("Error listening on socket.\n"); // Accept connections. SOCKET AcceptSocket; printf("Waiting for a client to connect...\n"); AcceptSocket = SOCKET_ERROR; while (AcceptSocket == SOCKET_ERROR) { AcceptSocket = accept(m_socket, NULL, NULL); } printf("Client Connected.\n"); //m_socket = AcceptSocket; int SentLen; int RecvLen = SOCKET_ERROR; char sendbuf[32]; // Send and receive data. int i = 0; while (1) { i = 0; char recvbuf[32]; RecvLen = recv(AcceptSocket, recvbuf, strlen(recvbuf), 0); for (i = 0; i < RecvLen; i++) { sendbuf[i] = toupper(recvbuf[i]); } SentLen = send(AcceptSocket, sendbuf, RecvLen , 0); if (SentLen > 0) std::cout << "成功回送客戶端\t" << SentLen << "資料" << std::endl; } closesocket(AcceptSocket); closesocket(m_socket); system("pause"); return; }
客戶端:
#include <stdio.h> #include "winsock2.h" #include <iostream> #pragma comment(lib,"WS2_32") void main() { std::cout << "啟動client端........." << std::endl; // Initialize Winsock. WSADATA wsaData; int iResult = WSAStartup(MAKEWORD(2, 2), &wsaData); if (iResult != NO_ERROR) printf("Error at WSAStartup()\n"); // Create a socket. SOCKET m_socket; m_socket = socket(AF_INET, SOCK_STREAM, 0); if (m_socket == INVALID_SOCKET) { printf("Error at socket(): %ld\n", WSAGetLastError()); WSACleanup(); return; } // Connect to a server. sockaddr_in clientService; clientService.sin_family = AF_INET; clientService.sin_addr.s_addr = inet_addr("127.0.0.1"); clientService.sin_port = htons(27015); if (connect(m_socket, (SOCKADDR*)&clientService, sizeof(clientService)) == SOCKET_ERROR) { printf("Failed to connect.\n"); WSACleanup(); return; } // Send and receive data. int SentLen; int RecvLen = SOCKET_ERROR; char recvbuf[32]; while (1) { char sendbuf[32]; std::cin >> sendbuf; //std::cout <<"strlen(sendbuf):"<< strlen(sendbuf) << std::endl; //std::cout <<"sizeof(sendbuf):"<< sizeof(sendbuf) << std::endl; SentLen = send(m_socket, sendbuf, strlen(sendbuf), 0); printf("SendLen: %ld\n", SentLen); RecvLen = recv(m_socket, recvbuf, SentLen, 0); if (RecvLen == 0 || RecvLen == WSAECONNRESET) { printf("Connection Closed.\n"); break; } if (RecvLen < 0) return; int i = 0; while (i < RecvLen) { std::cout << recvbuf[i++]; } std::cout << std::endl; } closesocket(m_socket); return; }
另外簡單附上測試圖片(小小的BUG也花了不少時間該,不過動手敲完後確實理解的更加深入)