You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Windows下g++编译C++ TCP服务器代码报错:'getaddrinfo'未在此作用域声明

问题解决方法

1. 修正_WIN32_WINNT宏定义的位置

getaddrinfo在Windows平台需要特定版本宏启用,必须将#define _WIN32_WINNT放在所有Windows相关头文件的最前方,包括WIN32_LEAN_AND_MEAN之前。建议使用支持该函数的最低兼容版本(如0x0501对应Windows XP):

#define _WIN32_WINNT 0x0501
#define WIN32_LEAN_AND_MEAN
#include <winsock2.h>
#include <ws2tcpip.h>

2. 添加MinGW环境专属宏定义

部分旧版MinGW的ws2tcpip.h中,getaddrinfo被包裹在__USE_W32_SOCKETS宏条件内,需额外添加该宏:

#define _WIN32_WINNT 0x0501
#define WIN32_LEAN_AND_MEAN
#define __USE_W32_SOCKETS
#include <winsock2.h>
#include <ws2tcpip.h>

3. 编译时链接Winsock库

即使解决编译期声明问题,后续链接阶段仍会报错,需指定链接ws2_32.lib库,编译命令如下:

g++ your_code.cpp -o server.exe -lws2_32

4. 补充Winsock初始化与清理代码

原代码缺少Winsock环境初始化和清理步骤,会导致运行时错误,完整示例代码:

#define _WIN32_WINNT 0x0501
#define WIN32_LEAN_AND_MEAN
#define __USE_W32_SOCKETS
#include <winsock2.h>
#include <ws2tcpip.h>
#include <cstring>

int main(){
    WSADATA wsaData;
    // 初始化Winsock环境
    int result = WSAStartup(MAKEWORD(2, 2), &wsaData);
    if (result != 0) {
        return 1;
    }

    struct addrinfo hints, *res;
    int sockfd;

    memset(&hints, 0, sizeof hints);
    hints.ai_family = AF_UNSPEC;
    hints.ai_socktype = SOCK_STREAM;
    hints.ai_flags = AI_PASSIVE;

    getaddrinfo(NULL, "3490", &hints, &res);

    sockfd = socket(res->ai_family, res->ai_socktype, res->ai_protocol);

    bind(sockfd, res->ai_addr, res->ai_addrlen);

    // 释放addrinfo链表资源
    freeaddrinfo(res);
    // 清理Winsock环境
    WSACleanup();
    return 0;
}

内容的提问来源于stack exchange,提问作者Nathan Heffington

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 11:35:18