簡體   English   中英

我如何獲取接口getaddrinfo()(addrinfo)用於connect()的IP

[英]How can I get the IP of the interface getaddrinfo() (addrinfo) uses for connect()

我需要能夠驗證我的應用程序使用的是正確的接口,而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);
    }

在前三個測試中, 60.xxx IP為200.xxx44.xxx200.xxx ,所以不太正確。 我可以驗證它是有效的套接字時,是否能夠在localhost之間發送/接收。

連接后,調用getsockname()找出套接字本地端的地址(遠程端的getpeername )。

您也可以在connect() bind()之前調用bind()來選擇一個特定的本地地址...如果希望操作系統選擇一個完全免費的臨時端口,那么請傳遞零作為端口號,就像根本不調用bind時一樣。

這達到了目的:

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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM