c++ - 为什么当我使用 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。
问题是为什么?
解决方案
该手册明确指出,第一个参数必须是“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 位)。
推荐阅读
- apache - 从 IP 地址重定向到另一个并保留 url 的其他部分
- node.js - 我正在将基本节点应用程序上传到 aws elastic beanstalk,当我进入环境时收到 502 bad gateway 响应
- ios - Swift:如何从 watchos 中的选取器中删除绿色边框?任何选择器样式?
- matplotlib - 自定义条形图matplotlib中的高度
- reactjs - 在 nextjs 中更改页面滚动上的标题背景颜色
- rust - 获得具有特定字段的向量的更好方法是形成结构向量?
- sql - 查询以获取多个类中的成员索引?
- c# - 单元测试中动态转换失败的通用解决方案
- flutter - 从 VSCode (Android) 闪烁 Flutter 应用程序
- delphi - 从没有运行时包的 dfm 文件构建加载组件时,EClassNotFound 错误问题