Kel*_*vin 5 winsock winsock2 getaddrinfo
我正在尝试制作一个简单的程序,它接受一个像 www.google.com 这样的字符串并返回 IP 地址......
到目前为止我所拥有的:
char* hostname = new char[www.size()+1];
std::copy(www.begin(), www.end(), hostname);
hostname[www.size()] = '\0';
struct addrinfo new_addr, *res;
getaddrinfo(www.c_str(), SERVICE.c_str(), &new_addr, &res);
cout << new_addr.ai_addr;
Run Code Online (Sandbox Code Playgroud)
第 4 个参数中的第 3 个应该做什么?getaddrinfo 函数是否修改了 new_addr 结构或什么?我不太了解 msdn 文档。解析主机名后,我想将套接字连接到它。
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);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
12254 次 |
| 最近记录: |