如何获取接口 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++;
}
我想我需要把它从 ptr
或 result
中取出来,但我不知道怎么做。
更新:
我添加了一些 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.x
、200.x.x.x
、60.x.x.x
IP,所以有些地方不太对劲。我可以验证当它是一个有效的套接字时,我能够 send/receive 在 localhost
.
之间
连接后,调用getsockname()
获取socket本端地址(getpeername
为远端)
您还可以在 connect()
之前调用 bind()
到 select 一个特定的本地地址...如果您希望 OS 到 select 一个免费的临时端口,就像您根本不调用 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);
我需要能够验证我的应用程序是否使用了正确的接口,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++;
}
我想我需要把它从 ptr
或 result
中取出来,但我不知道怎么做。
更新:
我添加了一些 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.x
、200.x.x.x
、60.x.x.x
IP,所以有些地方不太对劲。我可以验证当它是一个有效的套接字时,我能够 send/receive 在 localhost
.
连接后,调用getsockname()
获取socket本端地址(getpeername
为远端)
您还可以在 connect()
之前调用 bind()
到 select 一个特定的本地地址...如果您希望 OS 到 select 一个免费的临时端口,就像您根本不调用 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);