首页 > 解决方案 > 为什么当我使用 localhost 时“inet_pton”返回 0?

问题描述

我正在开发一个应用程序试图连接到另一个应用程序的套接字接口,这是我的套接字初始化:

const char* pszLocalHost = "localhost";

int intSocket = socket(AF_INET, SOCK_STREAM, 0);

if ( intSocket == 0 ) {
    clsDebugService::exitWhenDebugQueueEmpty("Failed to create socket!");
}    
struct hostent* pHostEntry = gethostbyname(pszLocalHost);

if ( pHostEntry == nullptr ) {
    clsDebugService::exitWhenDebugQueueEmpty("Unable to resolve ip address!");
}
//Initliase and get address of localhost
struct sockaddr_in srvAddr;
bzero((char*)&srvAddr, sizeof(srvAddr));
//Set-up server address    
memcpy(&srvAddr.sin_addr, pHostEntry->h_addr_list[0], pHostEntry->h_length);
srvAddr.sin_family = AF_INET;
srvAddr.sin_port = htons(clsSocketThread::mscuint16Port);
char* pszIP =  inet_ntoa(srvAddr.sin_addr);

if ( pszIP != nullptr ) {
    qdbg() << "Setting up socket on ip: " << pszIP 
           << ", port: " << clsSocketThread::mscuint16Port
           << ((strPurpose.isEmpty() == true) ? "" : strPurpose);
}
socklen_t tSvrAddr = sizeof(srvAddr);
int intRC;
if ( blnIsModule == true ) {
    if ( inet_pton(AF_INET, pszLocalHost, &srvAddr.sin_addr) <= 0 ) {
        clsDebugService::exitWhenDebugQueueEmpty("Invalid address not supported!");
    }
    intRC = ::connect(intSocket, (const struct sockaddr*)&srvAddr, tSvrAddr);
}

使用调试器,我发现了对inet_pton的调用的问题,它返回0,根据: https ://man7.org/linux/man-pages/man3/inet_pton.3.html

表示:如果 src 不包含表示指定地址族中有效网络地址的字符串,则返回 0。

问题是为什么?

标签: c++sockets

解决方案


该手册明确指出,第一个参数必须是“ddd.ddd.ddd.ddd”形式的 IPv4 地址或 IPv6 地址。由于“localhost”不是这两个,所以调用失败。不过,使用“127.0.0.1”应该可以。

这是手册中有关 IPv4 的引用:

该函数将字符串 src 转换为 af 地址族中的网络地址结构,然后将该网络地址结构复制到 dst。af 参数必须是 AF_INET 或 AF_INET6。dst 以网络字节顺序写入。

当前支持以下地址系列:

AF_INET src 指向一个包含点分十进制格式的 IPv4 网络地址的字符串,“ddd.ddd.ddd.ddd”,其中 ddd 是 0 到 255 范围内最多三位的十进制数。地址被转换到 struct in_addr 并复制到 dst,其长度必须为 sizeof(struct in_addr) (4) 个字节(32 位)。


推荐阅读