在进行套接字编程时,查找域名然后连接到它的正确方法是什么?
When doing socket programming, what is the correct way to look up a domain name and then connect to it?
我编写过网络应用程序,但主要是用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的那种时髦的cast对于我实际做的事情来说似乎太复杂了,导致我相信这不是"应该做"的方式。我只是太习惯高级语言了,这是它应该的方式,还是我错过了一个实用功能?
谢谢你的帮助
从技术上讲,您应该使用h_addrtype
而不是假设AF_INET
,然后根据该类型解释h_addr_list
。一旦你已经假设了AF_INET
(在socket
和connect
中),你也可以假设h_addr_list[0]
是一个in_addr
。你可以检查h_addrtype
,以防你得到一个AAAA记录(IPv6),这样你就可以拒绝它,而不是错误地转换它。
我相信最新和推荐的域名解析方法是使用getaddrinfo
(windows, linux)。
据我所知,没有标准的方法进行异步查找,因此产生一个专门用于进行DNS查找的线程是很常见的。
相关文章:
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- C++从另一个类访问公共静态向量的正确方法是什么
- 在 c++ 中拥有一组结构的正确方法是什么?
- 通过JNI传递数据数组的最快方法是什么
- 用常见虚拟函数实现的任意组合来实现派生类的正确方法是什么
- 使用不同的CRT将新的C++代码与旧的(二进制)组件隔离开来的最佳方法是什么
- 当无法使用模板和宏时,生成类型变体C++代码的最简单方法是什么?
- 在另一个类视图中添加最多2个图表的正确方法是什么
- 在C++中样板"冷/never_inline"错误处理技术的最佳方法是什么?
- 在 c++ 中对类中的 c 字符串动态数组进行排序的最佳方法是什么?
- 在C++中包含原型文件的正确方法是什么?
- 在 OpenCV C++ 中估计基本矩阵之前对相应点进行归一化的正确方法是什么?
- 在PostgreSQL中根据它们的ID选择大量行的最快方法是什么?
- 在OSX上使用CMake将Adobe的XMP工具包构建为共享库的最简单方法是什么?
- 将一系列整数放入类的最佳方法是什么?
- 从长整整转换为uint64_t的推荐方法是什么?
- C++:使用方法调用析构函数的顺序是什么?
- 将此布尔值传递给此函数的最有效方法是什么?