windows环境下的网络编程不同于linux中的网络编程,由于windows下涉及到编译器以及环境变量的配置,对新手来说会产生各种各样的问题。博主通过几天的调试运行,在几个IDE中进行了各种调试,最终将各种环境下的报错信息成功解决,希望能够对入门Socket的新手提供帮助。
首先是windows环境下,提供了两个头文件和两个库文件:winsock.h 和 winsock2.h 以及wsock32.lib 和 ws2_32.lib
winsock2.h 和 ws2_32.lib 是对 winsock.h 和 wsock32.lib 的升级,完善了相关文件中的不足,简单的 Socket 编程和调试可以使用任意种,博主使用的第二种,第一种的调试和解决和第二种一样
不管是在哪个IDE下进行调试,都要包含头文件:
#include "winsock2.h"
#include "windows.h" //该头文件并非必须
其次,为了能够生成可执行文件,必须要添加相应的库文件,添加库文件的操作比较麻烦。
Visual Studio
- 首先是 VS 环境下的socket 编程,VS默认情况下使用MSVC编译器,MSVC编译器独有一套预编译指令,通过这个预编译指令可以链接到相应的库文件:
#pragma comment (lib,"ws2_32")
- 或者可以在IDE环境中,点击解决方案资源管理器,右键Project项目,找到属性 -> C/C++ -> 常规 -> 附加包含目录 -> 编辑添加ws2_32库
Clion
CLion中建立新项目时,会自动生成CMakeList.txt文件,为了添加库文件,在CMakeLists.txt 文件中加入 link_libraries(ws2_32) 就可以运行了
VSCode
由于VSCode并非真正意义上的IDE,所以VSCode中的调试非常复杂。
首先确保电脑上装有minGW工具,然后必须在windows操作系统中添加环境变量,添加环境变量的目的是让你在磁盘的任意位置打开终端使用比如 gcc g++ cmake 工具时,系统能够识别这些指令具体的添加方式这里不在赘述。
main.cpp文件中:
#include "iostream"
#include "winsock2.h"
#include "windows.h"
int main()
{
WSADATA wsaData;
WSAStartup(MAKEWORD(2, 2), &wsaData);
int socklisten = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
std::cout << "socklisten is " << socklisten<< std::endl;
}
在VSCode的终端界面,使用gcc或g++命令生成可执行文件时,添加ws2_32库:
gcc main.cpp -o main -lws2_32
或者
g++ main.cpp -o main -lws2_32
如果报错,可以尝试更改顺序:
gcc main.cpp -lws2_32 -o main
或者
g++ main.cpp -lws2_32 -o main
当执行成功时,会生成可执行文件main.exe
还可以通过直接点击右上角的三角形按钮生成可执行文件,具体步骤为:
- 当你的VSCode中没有安装Code Runner这款插件时,需要在 task.json 文件中的tasks - args中添加 "-lwsock32"或"-lws2_32"
task.json:
{
"tasks": [
{
"type": "cppbuild",
"label": "C/C++: g++.exe 生成活动文件",
"command": "C:\\mingw64\\bin\\g++.exe",
"args": [
"-lwsock32",
"-fdiagnostics-color=always",
"-g",
"${file}",
"-o",
"${fileDirname}\\${fileBasenameNoExtension}.exe",
"-lwsock32"
],
"options": {
"cwd": "${fileDirname}"
},
"problemMatcher": [
"$gcc"
],
"group": {
"kind": "build",
"isDefault": true
},
"detail": "调试器生成的任务。"
}
],
"version": "2.0.0"
}
- 当安装了Code Runner插件时,程序会绕过task.json,使用code runner的设置运行,
解决办法:
在VSCode设置中搜索run code 进行设置,方法为:
编辑 Executor Map ,原文件为:
"c": "cd $dir && gcc $fileName -o $fileNameWithoutExt && $dir$fileNameWithoutExt",
更改为:
"c": "cd $dir && gcc $fileName -lws2_32 -o $fileNameWithoutExt && $dir$fileNameWithoutExt",
- 还可以通过使用 cmake 的方式,在VSCode文件裂变中中添加 CMakeLists.txt
添加完成后按Ctrl+Shift+P 调出设置选项,搜索CMake Configure 进行配置
同样在 CMakeLists.txt 文件中添加代码:
link_libraries(ws2_32)
一样可以生成可执行文件
博主电脑上由于安装了cygwin工具,导致系统的环境变量识别cmake指令时使用的是linux中的cmake工具,没有使用windows环境下的cmake工具,出现了许多错误,调试了很久才发现。
另外,当电脑上安装了多种工具集时,在使用make工具时,最好能指定使用哪个:
mingw32-make.exe