目錄
用Socket API建立簡易TCP服務端、客戶端
設定工程輸出目錄和中間目錄
創建基本的Windows網路環境
Windows服務端程式
Windows客戶端程式
用Socket API建立簡易TCP服務端、客戶端
- 用Socket API建立簡易TCP服務端
- 建立一個socket
- 系結接受客戶端連接的埠 bind
- 監聽網路埠 listen
- 等待接受客戶端連接 accept
- 向客戶端發送一條資料send
- 關閉socket closesocket
- 用Socket API建立簡易TCP客戶端
- 建立一個socket
- 連接服務器 connect
- 接收服務器資訊 recv
- 關閉socket closesocket
設定工程輸出目錄和中間目錄
$(SolutionDir)../bin/$(Platform)/$(Configuration)\ $(SolutionDir)../temp/$(Platform)/$(Configuration)/$(ProjectName)\
創建基本的Windows網路環境
- 引入頭檔案,WinSock2.h放在上面,否則出現重定義問題
#include <WinSock2.h> #include <windows.h>
- 或者使用宏 #define WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN #include <windows.h> #include <WinSock2.h>
- 創建基本的windows網路環境程式
#define WIN32_LEAN_AND_MEAN #include <windows.h> #include <WinSock2.h> #pragma comment(lib,"ws2_32.lib") int main() { WORD ver = MAKEWORD(2,2); WSAData dat; WSAStartup(ver, &dat); WSACleanup(); return 0; }
- 上面在代碼中添加,為了跨平臺,可以選擇在專案屬性,聯結器,輸入,附加依賴庫中添加,而不寫在代碼中
- 最終專案除錯結果:
Windows服務端程式
#define WIN32_LEAN_AND_MEAN #define _WINSOCK_DEPRECATED_NO_WARNINGS #include <windows.h> #include <WinSock2.h> #include <cstdio> #pragma comment(lib,"ws2_32.lib") int main() { WORD ver = MAKEWORD(2,2); WSAData dat; WSAStartup(ver, &dat); //1.創建socket套接字 SOCKET sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); //2,bind 系結用于接收客戶端連接的埠 sockaddr_in sinAddr = {}; sinAddr.sin_family = AF_INET; sinAddr.sin_port = htons(5678); //host to net unsigned short sinAddr.sin_addr.S_un.S_addr = INADDR_ANY; //inet_addr("127.0.0.1") if (SOCKET_ERROR == bind(sock, (sockaddr*)&sinAddr, sizeof(sockaddr_in))) { printf("Bind Error\n"); } else { printf("Bind Success\n"); } //3. listen 監聽網路埠 if (SOCKET_ERROR == listen(sock, 5)) { printf("Listen Error\n"); } else { printf("Listen Success\n"); } //4.accept 接收客戶端連接 sockaddr_in clientAddr = {}; int clAddrLen = sizeof(sockaddr_in); SOCKET sockAccpt = INVALID_SOCKET; char msgBuff[] = "Hello,I am Sever."; int msgBuffLen = strlen(msgBuff) + 1; while(true) { sockAccpt = accept(sock, (sockaddr*)&clientAddr, &clAddrLen); if (INVALID_SOCKET == sockAccpt) { printf("Accept Error\n"); } else { printf("Accept Success\n"); } printf("新客戶端地址:IP = %s \n", inet_ntoa(clientAddr.sin_addr)); // 5.send 向客戶端發送資料 send(sockAccpt, msgBuff, msgBuffLen, 0); } // 6.closesocket 關閉套接字 closesocket(sock); closesocket(sockAccpt); WSACleanup(); return 0; }
- 針對于Windows設計的某些錯誤,如需要定義#define _WINSOCK_DEPRECATED_NO_WARNINGS,也可以通過關閉SDL檢查排除
Windows客戶端程式
#define WIN32_LEAN_AND_MEAN #define _WINSOCK_DEPRECATED_NO_WARNINGS #include <windows.h> #include <WinSock2.h> #include <cstdio> #pragma comment(lib,"ws2_32.lib") int main() { WORD ver = MAKEWORD(2, 2); WSAData dat; WSAStartup(ver, &dat); //1.建立一個socket SOCKET sockCli = socket(AF_INET, SOCK_STREAM, 0); if (INVALID_SOCKET == sockCli) { printf("Socket Error\n"); } else { printf("Socket Success\n"); } //2. connect連接服務器 sockaddr_in servAddr = {}; servAddr.sin_family = AF_INET; servAddr.sin_port = htons(5678); servAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); int ret = connect(sockCli, (sockaddr*)&servAddr, sizeof(sockaddr_in)); if (SOCKET_ERROR == ret) { printf("Connect Error\n"); } else { printf("Connect Success\n"); } //3.接收服務器資訊 recv char recvBuff[256] = {}; int nlen = recv(sockCli, recvBuff, 256, 0); if (nlen > 0) { printf("接收到資料:%s \n", recvBuff); } //4.關閉套接字 closesocket closesocket(sockCli); WSACleanup(); getchar(); return 0; }
- 結果顯示
- 上述服務器與客戶端通信程序小結:
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/241408.html
標籤:其他
上一篇:山師選課







