【问题标题】:p2p communication using winsock使用winsock的p2p通信
【发布时间】:2009-09-26 04:44:13
【问题描述】:

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

【问题讨论】:

    标签: c++ winsock p2p


    【解决方案1】:

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

    请记住,并非所有主机名都有反向 DNS 条目。 gethostbyaddr 在真实、有效的 IP 地址上失败是完全合法的。如果你在做 p2p,最好不要依赖主机names,除了诊断显示(如果反向查找失败则回退到 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 name 时才需要。 inet_addr 已经为您提供了合适的连接地址。

    【讨论】:

      猜你喜欢
      • 2011-02-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-13
      相关资源
      最近更新 更多