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
相关产品推荐
相关产品推荐

