0

我正在尝试使用winsock实现点对点通信,但gethostbyaddr总是返回NULL,这个东西只适用于本地主机,server_name是目标IP地址

server_name="<--ipaddress-->"

struct sockaddr_in server;
addr = inet_addr(server_name);
cout<<"inet_addr(server_name) "<<addr<<endl;
hp = gethostbyaddr((char *)&addr, 4, AF_INET);
memset(&server, 0, sizeof(server));


memcpy(&(server.sin_addr), hp->h_addr, hp->h_length);
server.sin_family = hp->h_addrtype;
server.sin_port = htons(port);
conn_socket = socket(AF_INET, socket_type, 0); 

connect(conn_socket, (struct sockaddr*)&server, sizeof(server))

我们已经使用 python 实现了 p2p 通信,它在相同的端口号和地址上工作得非常好..感谢任何线索..

我不知道如何在 c++ 中做到这一点,在 python 中我们只使用了 bind(---) ,有人可以告诉我代码片段如何实现它。

4

1 回答 1

1

你从哪里来server_name?你确定这是一个有效的IP地址吗?另外,请检查WSAGetLastError()具体出了什么问题。

请记住,并非所有主机名都有反向 DNS 条目。gethostbyaddr在真实有效的 IP 地址上失败是完全合法的。如果你在做 p2p,最好不要依赖主机,除了诊断显示(如果反向查找失败,则回退到 IP 地址)。

编辑:使用您的新扩展代码示例,很明显您实际上根本不需要gethostbyaddr

struct sockaddr_in server;
memset((void*)&server, 0, sizeof(server));
server.sin_family = AF_INET;
server.sin_addr.S_un.S_long = inet_addr(server_name);
server.sin_port = htons(port);
conn_socket = socket(AF_INET, socket_type, 0); 

connect(conn_socket, (struct sockaddr*)&server, sizeof(server))

gethostbyaddr仅当您需要相关服务器的反向 DNS名称时才需要。inet_addr已经为您提供了一个合适的连接地址。

于 2009-09-26T04:47:37.807 回答