vs C++实现Socket通信、添加ws2_32.lib 静态链接库
1. 在vs下添加ws2_32.lib庫
右鍵【項目】-【屬性】-【鏈接器】-【輸入】-【附加依賴項】,進行編輯,添加?ws2_32.lib庫,去掉從父級或項目默認設置繼承的勾選,如下圖所示:
注意,下面的服務器端和客戶端代碼均寫入了這一句——#pragma comment(lib, "ws2_32.lib") //加載 ws2_32.lib,因此兩個程序都需要添加ws2_32.lib靜態鏈接庫。
2. 服務器端代碼Sever.cpp
#include <stdio.h> #include <winsock2.h> #pragma comment (lib, "ws2_32.lib") //加載 ws2_32.dllint main(){//初始化 DLLWSADATA wsaData;WSAStartup( MAKEWORD(2, 2), &wsaData);//創建套接字SOCKET servSock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);//綁定套接字sockaddr_in sockAddr;memset(&sockAddr, 0, sizeof(sockAddr)); //每個字節都用0填充sockAddr.sin_family = PF_INET; //使用IPv4地址sockAddr.sin_addr.s_addr = inet_addr("127.0.0.1"); //具體的IP地址sockAddr.sin_port = htons(1234); //端口bind(servSock, (SOCKADDR*)&sockAddr, sizeof(SOCKADDR));//進入監聽狀態listen(servSock, 20);//接收客戶端請求SOCKADDR clntAddr;int nSize = sizeof(SOCKADDR);SOCKET clntSock = accept(servSock, (SOCKADDR*)&clntAddr, &nSize);//向客戶端發送數據char *str = "Hello World!";send(clntSock, str, strlen(str)+sizeof(char), NULL);//關閉套接字closesocket(clntSock);closesocket(servSock);//終止 DLL 的使用WSACleanup();return 0; }在運行服務器端代碼時,有的vs會出現如下錯誤error C4996: 'inet_addr': Use inet_pton() or InetPton() instead or define _WINSOCK_DEPRECATED_NO_WARNINGS to disable deprecated API warnings,如下圖:
這是因為inet_addr是一個老函數,而微軟就是喜歡強迫別人用它的新函數。
【解決方案】
1. 用socket的新函數代替程序出現的所有老函數,此方法學習成本太高。
2. 在項目屬性里設置,告訴編譯器,我就用老函數,讓她不要報錯了。
所以推薦使用第二種解決方案,設置方法如下:
右鍵【項目】-【屬性】-【配置屬性】-【C/C++】-【常規】-【SDL檢查】的值改為“否”,如下圖:
再次運行,就不會報錯了。
3. 客戶端代碼Client.cpp
#include <stdio.h> #include <stdlib.h> #include <WinSock2.h> #pragma comment(lib, "ws2_32.lib") //加載 ws2_32.dll int main(){//初始化DLLWSADATA wsaData;WSAStartup(MAKEWORD(2, 2), &wsaData);//創建套接字SOCKET sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);//向服務器發起請求sockaddr_in sockAddr;memset(&sockAddr, 0, sizeof(sockAddr)); //每個字節都用0填充sockAddr.sin_family = PF_INET;sockAddr.sin_addr.s_addr = inet_addr("127.0.0.1");sockAddr.sin_port = htons(1234);connect(sock, (SOCKADDR*)&sockAddr, sizeof(SOCKADDR));//接收服務器傳回的數據char szBuffer[MAXBYTE] = {0};recv(sock, szBuffer, MAXBYTE, NULL);//輸出接收到的數據printf("Message form server: %s\n", szBuffer);//關閉套接字closesocket(sock);//終止使用 DLLWSACleanup();system("pause");return 0; }4. 運行調試
先運行 服務器端程序,再運行客戶端程序,輸出結果為:
Message form server: Hello World!
值得注意的是,由于這兩個程序沒有寫入while循環,所以server 只接受一次 client 請求,當 server 向 client 傳回數據后,程序就運行結束了。如果想再次接收到服務器的數據,必須再次運行 server,這只是一個非常簡陋的 socket 程序,不能夠一直接受客戶端的請求。
本文的存在,只是為了講述在vs環境下,跑通Socket程序的流程以及會遇到的問題及解決方法。
總結
以上是生活随笔為你收集整理的vs C++实现Socket通信、添加ws2_32.lib 静态链接库的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 简单的java方法_Java简单实用方法
- 下一篇: ^_^家园游记^_^