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。
答案 0 :(得分:2)
两个问题:
你断言sin包含一个AF_INET地址,但是没有检查gethostbyname()是否给你一个AF_INET地址
gethostbyname()为您提供二进制地址。 inet_addr()接受一个文本地址(“1.2.3.4”)并将其转换为二进制地址。你需要这样的东西:
sin.sin_addr = *(in_addr *) gethostbyname("www.steamcommunity.com")->h_addr_list[0];
(使用char *作为* h_addr_list的类型只是C的说法“它是一堆字节”,而不是任何类型的可读字符串。)
然而:
请使用getaddrinfo()而不是gethostbyname()。 MSDN说:“引入getaddrinfo函数已经弃用了gethostbyname函数。建议创建Windows套接字2应用程序的开发人员使用getaddrinfo函数而不是gethostbyname”(出于各种原因)。
您不能假设您的DNS(或其他)查找将完全返回AF_INET地址。它可以返回任意数量的任何地址 - 这就是getaddrinfo()存在的原因之一。
请检查返回值: