vs C++实现Socket通信、添加ws2_32.lib 静态链接库

vs C++实现Socket通信、添加ws2_32.lib 静态链接库1 在 vs 下添加 ws2 32 lib 库 右键 项目 属性 链接器 输入 附加依赖项 进行编辑 添加 ws2 32 lib 库 去掉从父级或项目默认设置继承的勾选 如下图所示 注意 下面的服务器端和客户端代码均写入了这一句 pragma comment 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.dll int main(){ //初始化 DLL WSADATA 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(){ //初始化DLL WSADATA 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); //终止使用 DLL WSACleanup(); system("pause"); return 0; } 

4. 运行调试

值得注意的是,由于这两个程序没有写入while循环,所以server 只接受一次 client 请求,当 server 向 client 传回数据后,程序就运行结束了。如果想再次接收到服务器的数据,必须再次运行 server,这只是一个非常简陋的 socket 程序,不能够一直接受客户端的请求。

本文的存在,只是为了讲述在vs环境下,跑通Socket程序的流程以及会遇到的问题及解决方法。

小讯
上一篇 2025-03-12 13:05
下一篇 2025-02-06 21:40

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/42202.html