首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用getaddrinfo()?

如何使用getaddrinfo()?
EN

Stack Overflow用户
提问于 2013-03-29 07:29:27
回答 2查看 12.6K关注 0票数 5

我正在试着做一个简单的程序,它接受一个像www.google.com这样的字符串并返回ip地址……

到目前为止,我所拥有的:

代码语言:javascript
复制
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;

第四个参数中的第三个参数应该做什么?getaddrinfo函数是否修改了new_addr结构?我并不真正理解msdn文档。在解析主机名之后,我想连接一个套接字到它。

EN

回答 2

Stack Overflow用户

发布于 2013-03-29 15:58:58

如果我让第三个参数为空怎么办?

这是我到目前为止开发的代码。

代码语言:javascript
复制
    char* hostname = new char[www.size()+1];
copy(www.begin(), www.end(), hostname);
hostname[www.size()] = '\0';

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;

server.sin是在其他地方声明的,我用它来填充我的sockets类的另一个方法中的socket。

票数 2
EN

Stack Overflow用户

发布于 2013-03-29 08:44:12

MSDN文档非常详细,并准确地解释了各种参数的用途。第三个参数允许您指定将与查找结果一起使用的套接字类型。这将使结果根据需要进行优化。第四个参数返回实际结果。该文档还包含有关如何使用该函数的完整示例。那么,对于文档所说的内容,哪个示例是不清楚的?

试试这个:

代码语言:javascript
复制
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);
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15693945

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档