【发布时间】:2012-08-06 14:41:45
【问题描述】:
这段代码在 Windows 上运行正常,但在 Linux 上 gethostbyaddr 返回 NULL。
我尝试了很多更改,但都没有成功。
我的 /etc/host.conf 有以下行
订购主机,绑定
我运行完整代码并传递地址 11.234.456.74, 在 Windows 上 gethostbyaddr 解析地址并且工作正常。 但是在 Linux 上它不解析 ip 地址并返回 NULL。
请帮忙。
#ifdef WIN32
if (init){
WSADATA wsaData;
// Request Winsock version 2.2
if (WSAStartup (MAKEWORD(1, 1), &wsaData) != 0) {
WSACleanup();
exit (EXIT_FAILURE);
}
init = 0;
}
#endif
// Open required socket
p_socket[IP_SOCKET_SOCKET] = socket(AF_INET, server_socket_type, 0);
if ( p_socket[IP_SOCKET_SOCKET] < 0 ) {
#ifdef WIN32
WSACleanup();
#endif
exit (EXIT_FAILURE);
}
destAdrLen = mxGetM(prhs[0]) * mxGetN(prhs[0]) + 1;
destAdr = (char *) mxMalloc(destAdrLen);
if (destAdr == NULL) {
mexErrMsgTxt("mxMalloc(destAdrLen) failed");
}
mxGetString(prhs[0], destAdr, destAdrLen);
destPort = (int) mxGetScalar(prhs[1]);
if (isalpha(destAdr[0])) {
// socket address is a name
hp = gethostbyname(destAdr);
}
else {
// socket address is a number
addr = inet_addr(destAdr);
hp = gethostbyaddr((char *)&addr, 4, AF_INET);
}
【问题讨论】:
-
11.234.456.74 不是有效的 IPv4 地址,这可能是原因。
h_errno有什么价值? -
感谢丹尼尔的评论。这是一个错字。我的意思是说 11.234.217.74 这是一个有效的地址。在 Windows 上运行代码时,它可以正确解析。但是在 Linux 上运行时失败。 gethostbyaddr 在 Linux 上返回 NULL。
-
您为
destAdr分配了内存,但它似乎是空的……至少在您的示例代码中。 -
@shinkou 是对的。您为
destAdr分配了内存,但在使用它之前没有将IP 字符串复制到其中,因此它包含垃圾。这段代码也不可能在 Windows 上运行。 -
我添加了几行缺失的代码。 destAdr 和 destPort 从 matlab 中的调用函数传递给代码。该代码在 Windows 中运行良好。如果我在 Lunix 中检查指针 hp 。运行后为0。
标签: c networking network-programming