使用winsock进行p2p通信

时间:2009-09-26 04:44:13

标签: c++ winsock p2p

我正在尝试使用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(---),有人可以告诉我代码片段如何实现它。

1 个答案:

答案 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 名称时,才需要

gethostbyaddrinet_addr已经为您提供了一个合适的地址来连接。