如何获取getaddrinfo()(addrinfo)用于connect()的接口的IP

时间:2016-02-17 18:47:43

标签: c++ windows networking ip winsock2

我需要能够验证我的应用是否正在使用正确的界面和IMO,最好的方法是知道它尝试使用的界面的IP。

struct addrinfo                 *result = NULL,
                                *ptr = NULL,
                                hints;

getaddrinfo(sServer.c_str(), DEFAULT_PORT, &hints, &result);

ptr=result;

iResult = SOCKET_ERROR;

int iTries = 0;
while (iResult == SOCKET_ERROR && iTries <= 5)
{
    // Create a SOCKET for connecting to server
    m_ConnectSocket = socket(ptr->ai_family, ptr->ai_socktype, ptr->ai_protocol);

    // Connect to server.
    iResult = connect( m_ConnectSocket, ptr->ai_addr, (int)ptr->ai_addrlen);
    if (iResult == SOCKET_ERROR)
    {
        closesocket(m_ConnectSocket);
        m_ConnectSocket = INVALID_SOCKET;

        ptr = result->ai_next;
    }

    iTries++;
}

我猜我需要从ptrresult中取出它,但我不知道如何。

更新

我添加了一些getsockname()代码,据我所知,这只是制作随机IP。我不知道他们来自哪里:

    if (iResult == SOCKET_ERROR)
    {
        closesocket(m_ConnectSocket);
        m_ConnectSocket = INVALID_SOCKET;

        ptr = result->ai_next;
    }
    else
    {
        SOCKADDR_IN ClientSocketInterface;

        getsockname(m_ConnectSocket, (SOCKADDR*)&ClientSocketInterface, (int*)sizeof(ClientSocketInterface));

        string sIP = inet_ntoa(ClientSocketInterface.sin_addr);
    }

我在前三个测试中得到了44.x.x.x200.x.x.x60.x.x.x IP,所以事情并不完全正确。我可以验证当它是有效套接字时,我能够在localhost之间发送/接收。

2 个答案:

答案 0 :(得分:1)

连接后,请拨打$(document).ready(function($){ $('h2').html(function (i, html) { var text = $($.parseHTML(html)).text().match(/\w+\s\w+/)[0]; return html.replace(text, '<span>'+text+'</span>');; }); }); 以查找套接字本地端的地址(远程端为getsockname())。

您还可以在getpeername之前调用bind()来选择特定的本地地址...如果您希望操作系统选择一个免费的短暂端口,则将零传递为端口号。根本不打电话给。

答案 1 :(得分:1)

这就是诀窍:

SOCKADDR_IN ClientSocketInterface;
memset(&ClientSocketInterface, 0, sizeof(ClientSocketInterface));
int iNlen = sizeof(ClientSocketInterface);

getsockname(m_ConnectSocket, (SOCKADDR*)&ClientSocketInterface, &iNlen);

string sIP = inet_ntoa(ClientSocketInterface.sin_addr);
STrace = String::Format("Client IP: [{0}:{1}]", gcnew String(sIP.c_str()), htons(ClientSocketInterface.sin_port));
Trace(STrace, TRACE_INFO);