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

InetPton解析127.0.0.1返回0?x64 Windows下TCP程序问题

问题解决:InetPton解析127.0.0.1返回0的原因及修复

核心问题出在字符集不匹配:你的项目大概率开启了UNICODE预编译宏,此时标准库会把InetPton自动替换为宽字符版本InetPtonW,而你传入的是const char*类型的ASCII字符串,类型不匹配导致解析失败,返回0表示无效输入。

修复方案

方案1:明确使用ANSI版本函数

直接调用InetPtonA(专门处理ASCII字符串的版本),替换原代码中的InetPton:

int result = InetPtonA(AF_INET, serverAddress, &serverAddr.sin_addr);

方案2:关闭UNICODE宏(若无需宽字符支持)

在Visual Studio中修改项目设置:

  • 右键项目 → 属性 → 配置属性 → C/C++ → 预处理器 → 预处理器定义
  • 移除UNICODE和_UNICODE两项,保存后重新编译。

额外注意:链接Ws2_32.lib库

确保链接器正确加载Winsock库,可在代码开头添加:

#pragma comment(lib, "Ws2_32.lib")

或者在项目属性的链接器附加依赖项中添加Ws2_32.lib,避免运行时链接错误。

修正后的完整代码示例

#include <stdio.h>
#include <stdlib.h>
#include <winsock2.h>
#include <WS2tcpip.h>
#include <winerror.h>

#pragma comment(lib, "Ws2_32.lib")

int initWinsock() {
    WSADATA wsaData;
    int result = WSAStartup(MAKEWORD(2, 2), &wsaData);
    if (result != 0) {
        char buffer[1024];
        sprintf_s(buffer, sizeof(buffer), "WSAStartup fehlgeschlagen: %d\n", result);
        OutputDebugStringA(buffer);
        return 1;
    }
    OutputDebugStringA("[1/3] WSAStartup successful\n");
    return 0;
}

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
    if (initWinsock() != 0) {
        return 1;
    }

    const char* serverAddress = "127.0.0.1";
    int serverPort = 64263;
    char errorMessage[256];

    SOCKET clientSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (clientSocket == INVALID_SOCKET) {
        sprintf_s(errorMessage, sizeof(errorMessage), "Socket-Error: %d\n", WSAGetLastError());
        OutputDebugStringA(errorMessage);
        WSACleanup();
        return 1;
    }
    else {
        OutputDebugStringA("[2/3] Socket created successfully!\n");
    }

    //Server-Adress
    struct sockaddr_in serverAddr;
    ZeroMemory(&serverAddr, sizeof(serverAddr));
    serverAddr.sin_family = AF_INET;
    serverAddr.sin_port = htons(serverPort);

    // 使用ANSI版本的InetPtonA
    int result = InetPtonA(AF_INET, serverAddress, &serverAddr.sin_addr);
    if (result == -1) {
        sprintf_s(errorMessage, sizeof(errorMessage), "InetPton-Error: %d\n", WSAGetLastError());
        OutputDebugStringA(errorMessage);
        closesocket(clientSocket);
        WSACleanup();
        return 1;
    }
    else if (result == 0) {
        sprintf_s(errorMessage, sizeof(errorMessage), "IP could not be parsed!\nLast WSAError: %d\n", WSAGetLastError());
        OutputDebugStringA(errorMessage);
        closesocket(clientSocket);
        WSACleanup();
        return 1;
    }
    else if(result == 1) {
        OutputDebugStringA("[3/3] Server defined successfully\n");
    }

    // 这里可以添加连接服务器的代码
    // connect(clientSocket, (struct sockaddr*)&serverAddr, sizeof(serverAddr));

    closesocket(clientSocket);
    WSACleanup();
    return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 06:34:53