如何使用getaddrinfo()
How to use getaddrinfo()?
本文关键字:getaddrinfo 何使用 更新时间:2023-10-16
我想做一个简单的程序,在一个字符串,如www.google.com,并返回ip地址…
到目前为止我有什么:
char* hostname = new char[www.size()+1];
std::copy(www.begin(), www.end(), hostname);
hostname[www.size()] = ' ';
struct addrinfo new_addr, *res;
getaddrinfo(www.c_str(), SERVICE.c_str(), &new_addr, &res);
cout << new_addr.ai_addr;
第三个或第四个参数应该做什么?getaddrinfo函数是否修改了new_addr结构?我真的不懂msdn文档。解析主机名后,我想将一个套接字连接到它。
如果第三个参数为空会怎样?
是目前为止我开发的代码。
char* hostname = new char[www.size()+1];
copy(www.begin(), www.end(), hostname);
hostname[www.size()] = ' ';
struct addrinfo *res;
struct in_addr addr;
getaddrinfo(hostname, NULL, 0, &res);
addr.S_un = ((struct sockaddr_in *)(res->ai_addr))->sin_addr.S_un;
server.sin_addr.s_addr = inet_addr(inet_ntoa(addr));
server.sin_port = htons(portno);
freeaddrinfo(res);
delete []hostname;
服务器。
MSDN文档非常详细,并准确地解释了各种参数的作用。第三个参数允许您指定将与查找结果一起使用的套接字类型。这使得结果可以根据需要进行优化。第四个参数返回实际结果。文档还包含如何使用该函数的完整示例。那么什么例子是不清楚的文件说什么?
试试这个:
struct addrinfo hints = {0};
hints.ai_flags = 0;
hints.ai_family = AF_UNSPEC; // IPv4 and IPv6 allowed
hints.ai_socktype = SOCK_STREAM;
hints.ai_protocol = IPPROTO_TCP;
struct addrinfo *res = NULL;
if (getaddrinfo(www.c_str(), SERVICE.c_str(), &hints, &res) == 0)
{
TCHAR szIPAddr[64];
DWORD szIPAddrLen;
SOCKET skt;
struct addrinfo *addr = res;
do
{
skt = socket(addr->ai_family, addr->ai_socktype, addr->ai_protocol);
if (skt == INVALID_SOCKET)
cout << "Unable to create socket, error " << WSAGetLastError() << endl;
else
{
szIPAddrLen = 64;
WSAAddressToString(addr->ai_addr, addr->ai_addrlen, NULL, szIPAddr, &szIPAddrLen);
cout << "Connecting to " << szIPAddr << " ..." << endl;
if (connect(skt, addr->ai_addr, addr->ai_addrlen) == 0)
{
cout << "Connected!" << endl;
break;
}
cout << "Unable to connect, error " << WSAGetLastError() << endl;
closesocket(skt);
skt = INVALID_SOCKET;
}
addr = addr->ai_next;
}
while (addr);
freeaddrinfo(res);
if (skt != INVALID_SOCKET)
{
// use skt as needed...
closesocket(skt);
}
}
相关文章:
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- C++:TypeDef使用元组
- 使用std::multimap迭代器创建std::list
- 从不同线程使用int64的不同字节安全吗
- 比较并显示使用最小值(a,b)和最大值(a、b)升序排列的4个数字
- 为什么在全局范围内使用"extern int a"似乎不行?
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 如何使用Google Mock来模拟gettimeofday()
- 使用 DnsQuery 或 getaddrinfo 的正确函数是什么?
- 使用 LLVM 的 libc++ 时,__1 符号从何而来?
- 在std::cout之后使用std::cin时,换行符从何而来
- C++ - getaddrinfo() - 使用动态 DNS 获取自己的外部 IP 失败
- 如何使用'getaddrinfo'为所有接口选择默认空闲端口?
- 为什么以及在何处在C++中使用引用和指针
- getaddrinfo():使用No IP注册的域的IP地址
- 如何使用套接字api getaddrinfo绕过本地DNS缓存
- 基例如何影响使用递归函数的哪些行
- 如何使用getaddrinfo()
- 使用getaddrinfo中url:port/url的c++套接字编程