我正在尝试使用winsock实现点对点通信,但gethostbyaddr
总是返回NULL,这个东西只能在localhost上运行,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(---),有人可以告诉我代码片段如何实现它。
答案 0 :(得分: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))
仅当您需要相关服务器的反向DNS 名称时,才需要 gethostbyaddr
。 inet_addr
已经为您提供了一个合适的地址来连接。