Windows环境下的C/C++ Socket网络编程报错解决办法

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

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
C/C++ 网络编程是使用 C/C++ 编程语言来实现网络通信的技术。通过网络编程,可以在不同的计算机之间进行数据交换和通信。网络编程主要涉及以下几个方面: 1. 套接字编程:套接字是网络编程的基础,它允许不同计算机之间通过网络进行通信。在 C/C++ 中,我们可以使用 socket 函数来创建套接字,并使用相关的函数来发送和接收数据。 2. TCP/IP 协议:TCP/IP 是网络通信的基本协议,它是一系列规范和协议的集合,用于在 Internet 上的不同计算机之间进行数据传输。C/C++ 网络编程中,我们可以使用相关的库函数和结构体来实现 TCP/IP 协议的功能,包括建立连接、发送和接收数据等。 3. 客户端和服务器:在网络编程中,通常有客户端和服务器两个角色。客户端是发起网络请求的一方,服务器是提供网络服务和响应请求的一方。C/C++ 网络编程可以通过套接字编程和 TCP/IP 协议来实现客户端和服务器之间的通信。 4. 多线程和并发:网络编程中,往往需要同时处理多个客户端请求。 C/C++ 提供了多线程编程的支持,可以使用线程来处理并发的网络请求。多线程编程可以提高网络程序的性能和效率。 总之,C/C++ 网络编程是一种使用 C/C++ 语言进行网络通信的技术。通过掌握套接字编程、TCP/IP 协议、客户端和服务器的概念以及多线程和并发技术,可以实现各种网络应用程序,如聊天程序、文件传输、远程控制等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值