c ++套接字连接错误

时间:2014-03-07 12:41:50

标签: c++ sockets

SOCKET s;
s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
SOCKADDR_IN sin;
sin.sin_family = AF_INET;
sin.sin_port = htons(80);
sin.sin_addr.s_addr = inet_addr(gethostbyname("www.steamcommunity.com") -> h_addr_list[0]);
cout << gethostbyname("www.steamcommunity.com") -> h_addr_list[0]; /* this prints "?ф▀gwww.steamcommunity.com" in cmd */
if(SOCKET_ERROR == connect(s, (sockaddr *)&sin, sizeof(sockaddr))){
    cout << "\nconnect = SOCKET_ERROR "; /* error and exit the function */
    return;
}

这里有什么不对?我将更多细节添加到otto to。

1 个答案:

答案 0 :(得分:2)

两个问题:

  1. 你断言sin包含一个AF_INET地址,但是没有检查gethostbyname()是否给你一个AF_INET地址

  2. gethostbyname()为您提供二进制地址。 inet_addr()接受一个文本地址(“1.2.3.4”)并将其转换为二进制地址。你需要这样的东西:

    sin.sin_addr = *(in_addr *) gethostbyname("www.steamcommunity.com")->h_addr_list[0];
    
  3. (使用char *作为* h_addr_list的类型只是C的说法“它是一堆字节”,而不是任何类型的可读字符串。)

    然而:

    • 请使用getaddrinfo()而不是gethostbyname()。 MSDN说:“引入getaddrinfo函数已经弃用了gethostbyname函数。建议创建Windows套接字2应用程序的开发人员使用getaddrinfo函数而不是gethostbyname”(出于各种原因)。

    • 您不能假设您的DNS(或其他)查​​找将完全返回AF_INET地址。它可以返回任意数量的任何地址 - 这就是getaddrinfo()存在的原因之一。

    • 请检查返回值:

      • socket()可能会失败。
      • gethostbyname()可以返回NULL:您需要在将返回值作为struct hostent取消引用之前进行检查。