vs C++实现Socket通信、添加ws2_32.lib 静态链接库
1. 在vs下添加ws2_32.lib庫
右鍵【項目】-【屬性】-【鏈接器】-【輸入】-【附加依賴項】,進行編輯,添加?ws2_32.lib庫,去掉從父級或項目默認設(shè)置繼承的勾選,如下圖所示:
注意,下面的服務(wù)器端和客戶端代碼均寫入了這一句——#pragma comment(lib, "ws2_32.lib") //加載 ws2_32.lib,因此兩個程序都需要添加ws2_32.lib靜態(tài)鏈接庫。
2. 服務(wù)器端代碼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);//創(chuàng)建套接字SOCKET servSock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);//綁定套接字sockaddr_in sockAddr;memset(&sockAddr, 0, sizeof(sockAddr)); //每個字節(jié)都用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));//進入監(jiān)聽狀態(tài)listen(servSock, 20);//接收客戶端請求SOCKADDR clntAddr;int nSize = sizeof(SOCKADDR);SOCKET clntSock = accept(servSock, (SOCKADDR*)&clntAddr, &nSize);//向客戶端發(fā)送數(shù)據(jù)char *str = "Hello World!";send(clntSock, str, strlen(str)+sizeof(char), NULL);//關(guān)閉套接字closesocket(clntSock);closesocket(servSock);//終止 DLL 的使用WSACleanup();return 0; }在運行服務(wù)器端代碼時,有的vs會出現(xiàn)如下錯誤error C4996: 'inet_addr': Use inet_pton() or InetPton() instead or define _WINSOCK_DEPRECATED_NO_WARNINGS to disable deprecated API warnings,如下圖:
這是因為inet_addr是一個老函數(shù),而微軟就是喜歡強迫別人用它的新函數(shù)。
【解決方案】
1. 用socket的新函數(shù)代替程序出現(xiàn)的所有老函數(shù),此方法學習成本太高。
2. 在項目屬性里設(shè)置,告訴編譯器,我就用老函數(shù),讓她不要報錯了。
所以推薦使用第二種解決方案,設(shè)置方法如下:
右鍵【項目】-【屬性】-【配置屬性】-【C/C++】-【常規(guī)】-【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);//創(chuàng)建套接字SOCKET sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);//向服務(wù)器發(fā)起請求sockaddr_in sockAddr;memset(&sockAddr, 0, sizeof(sockAddr)); //每個字節(jié)都用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));//接收服務(wù)器傳回的數(shù)據(jù)char szBuffer[MAXBYTE] = {0};recv(sock, szBuffer, MAXBYTE, NULL);//輸出接收到的數(shù)據(jù)printf("Message form server: %s\n", szBuffer);//關(guān)閉套接字closesocket(sock);//終止使用 DLLWSACleanup();system("pause");return 0; }4. 運行調(diào)試
先運行 服務(wù)器端程序,再運行客戶端程序,輸出結(jié)果為:
Message form server: Hello World!
值得注意的是,由于這兩個程序沒有寫入while循環(huán),所以server 只接受一次 client 請求,當 server 向 client 傳回數(shù)據(jù)后,程序就運行結(jié)束了。如果想再次接收到服務(wù)器的數(shù)據(jù),必須再次運行 server,這只是一個非常簡陋的 socket 程序,不能夠一直接受客戶端的請求。
本文的存在,只是為了講述在vs環(huán)境下,跑通Socket程序的流程以及會遇到的問題及解決方法。
總結(jié)
以上是生活随笔為你收集整理的vs C++实现Socket通信、添加ws2_32.lib 静态链接库的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 简单的java方法_Java简单实用方法
- 下一篇: Windows下的gcc/gc++编译环