【发布时间】:2018-10-05 11:22:03
【问题描述】:
如果我执行命令 ping "" 或 tracert "" 它会解析我当前的计算机名称。
但是当我执行下面的代码时,它会将计算机名称解析为“204.204.204.204”
#include <winsock2.h>
#include <ws2tcpip.h>
#include <string>
#include <iostream>
#pragma comment(lib, "Ws2_32.lib")
void get_computer_name(const std::string& ip_address, std::string& computer_name)
{
WSADATA wsa_data;
u_short port = 27015;
struct sockaddr_in socket_address;
char service_info[NI_MAXSERV] = {};
WSAStartup(MAKEWORD(2, 2), &wsa_data);
socket_address.sin_family = AF_INET;
const auto error_code = InetPtonA(AF_INET, &ip_address[0], &socket_address.sin_addr.s_addr);
socket_address.sin_port = htons(port);
computer_name.resize(NI_MAXHOST);
getnameinfo((struct sockaddr *) &socket_address,
sizeof(socket_address),
&computer_name[0],
NI_MAXHOST, service_info, NI_MAXSERV, NI_NUMERICSERV);
WSACleanup();
}
int main(int argc, wchar_t **argv)
{
std::string computer_name;
get_computer_name("", computer_name);
std::cout << computer_name << std::endl;
return 0;
}
我很好奇为什么是204.204.204.204?
【问题讨论】:
-
为什么不检查这些函数的返回值?你只是假设他们成功并且他们的结果是有意义的,但这并不一定是真的。
-
你应该经常检查函数是否成功执行
InetPtonA如果发生错误返回1。204对应于0xCC,对于某些编译和环境,它可能表示调试模式下的内存未初始化。 -
您需要阅读 each 函数调用的文档,并弄清楚如何正确检查返回值。
if (error_code)不好。 -
@Mayur 是我的假设,即您现在在问题中显示的代码不再获得
204.204.204.204吗?如果是,您不应该对您的问题进行此类更改,因为代码不再反映问题的问题,从而导致答案错误并且“无用”。 -
@t.niese 哦,是的。我已经恢复了代码
标签: c++ winapi visual-c++ winsock