gpt4 book ai didi

c++ - 做socket编程时,查找域名然后连接的正确方法是什么?

转载 作者:太空狗 更新时间:2023-10-29 21:49:59 24 4
gpt4 key购买 nike

我编写过网络应用程序,但主要使用 Python。

我正在编写一个 C++ 应用程序,我对查找域名并连接到它的 IP 地址的确切语法有点模糊。

具体来说,我不确定如何形成对套接字的 gethostbyname() 调用的结果。

我的代码目前看起来像这样:

const hostent* host = GetHost(); //This works correctly
if (!host) {
DebugMessage("Bad host", "Could not resolve host");
return NULL;
}
DebugMessage("Got host", host->h_name);

SOCKET s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
sockaddr_in addr;
addr.sin_family = AF_INET;
//This funky cast is what i'm concerned about
addr.sin_addr.s_addr = (*((in_addr*)(host->h_addr_list[0]))).s_addr;
addr.sin_port = htons(80);

DebugMessage("addr", (*((in_addr*)(host->h_addr_list[0]))).s_addr);

int c = connect(s, (SOCKADDR*)&addr, sizeof(addr));
int le = WSAGetLastError();
if (c == SOCKET_ERROR) {
//etc...

它确实有效,但在我看来,分配 s_addr 的时髦转换对于我实际做的事情来说似乎太复杂了,这让我相信这不是“应该完成的”方式。我是不是太习惯于高级语言了,这是应该的方式,还是我在某处缺少实用函数?

感谢您的帮助。

最佳答案

从技术上讲,您应该使用 h_addrtype 而不是假定 AF_INET 然后根据该类型解释 h_addr_list。一旦您已经假定 AF_INET(在 socketconnect 中),您也可以假定 h_addr_list[0] 是一个 in_addr 正如你正在做的那样。您可以检查 h_addrtype 以防您获得 AAAA 记录 (IPv6),这样您就可以拒绝它而不是误投它。

关于c++ - 做socket编程时,查找域名然后连接的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7262739/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com