C++ WSARecvFrom目标ip地址
我使用WSARecvFrom函数。看起来是这样的:C++ WSARecvFrom目标ip地址,c++,sockets,udp,C++,Sockets,Udp,我使用WSARecvFrom函数。看起来是这样的: addr.sin_addr.s_addr = INADDR_ANY; addr.sin_port = htons(listen_port); bind(s, reinterpret_cast<PSOCKADDR>(&addr), sizeof(addr)); ... WSARecvFrom(s, ..., reinterpret_cast<sockaddr *>(&event->address
addr.sin_addr.s_addr = INADDR_ANY;
addr.sin_port = htons(listen_port);
bind(s, reinterpret_cast<PSOCKADDR>(&addr), sizeof(addr));
...
WSARecvFrom(s, ..., reinterpret_cast<sockaddr *>(&event->address), &event->addressLength, ...);
初始化:
if (dwMajorVersion >= 6)
{
if (pfWSARecvMsg == NULL)
{
// get WSARecvMsg pointer
GUID WSARecvMsg_GUID = WSAID_WSARECVMSG;
DWORD NumberOfBytes = 0;
if (WSAIoctl(socket_, SIO_GET_EXTENSION_FUNCTION_POINTER,
&WSARecvMsg_GUID, sizeof(WSARecvMsg_GUID),
&pfWSARecvMsg, sizeof(pfWSARecvMsg),
&NumberOfBytes, NULL, NULL) == SOCKET_ERROR)
{
printf("Could not get WSARecvMsg. WSAGetLastError returned [%i]", WSAGetLastError());
pfWSARecvMsg = NULL;
}
}
if (pfWSASendMsg == NULL)
{
// get WSASendMsg pointer
GUID WSASendMsg_GUID = WSAID_WSASENDMSG;
DWORD NumberOfBytes = 0;
if (WSAIoctl(socket_, SIO_GET_EXTENSION_FUNCTION_POINTER,
&WSASendMsg_GUID, sizeof(WSASendMsg_GUID),
&pfWSASendMsg, sizeof(pfWSASendMsg),
&NumberOfBytes, NULL, NULL) == SOCKET_ERROR)
{
printf("Could not get WSASendMsg. WSAGetLastError returned [%i]", WSAGetLastError());
pfWSASendMsg = NULL;
}
}
}
使用WSASendToEx的示例:
int result = WSASendToEx(event->socket_, &sendBufferDescriptor, 1, &dwSent, 0,
reinterpret_cast<sockaddr *>(&event->address), event->addressLength,
from, event->controlBuffer, sizeof(event->controlBuffer),
&event->overlapped, NULL);
int result=WSASendToEx(事件->套接字和发送缓冲描述符,1,&dwSent,0,
重新解释\u cast(&event->address),event->addressLength,
from,event->controlBuffer,sizeof(event->controlBuffer),
&事件->重叠,空);
WSARecvFromEx的用法示例:
int result = WSARecvFromEx(event->socket_, &recvBufferDescriptor, 1,
&numberOfBytes, &recvFlags,
reinterpret_cast<sockaddr *>(&event->address), &event->addressLength,
event->controlBuffer, sizeof(event->controlBuffer),
&event->overlapped, NULL);
int result=WSARecvFromEx(事件->socket\ux,&recvBufferDescriptor,1,
&numberOfBytes和recvFlags,
重新解释强制转换(&event->address),&event->addressLength,
事件->控制缓冲区,sizeof(事件->控制缓冲区),
&事件->重叠,空);
当绑定到INADDR\u ANY
时,无法从WSARecvFrom()
获取目标IP。如果您需要目标IP,则必须为要接收的每个本地IP创建并绑定一个单独的套接字,然后可以使用getsockname()
了解接收套接字绑定到哪个本地IP。感谢您的回复,但我找到了解决方案:可以使用WSARECVMG函数获取目标IP(从Windows XP开始提供,但在XP上它给了我一个例外,在Win 7和Win Server 2008上工作正常)。
int result = WSARecvFromEx(event->socket_, &recvBufferDescriptor, 1,
&numberOfBytes, &recvFlags,
reinterpret_cast<sockaddr *>(&event->address), &event->addressLength,
event->controlBuffer, sizeof(event->controlBuffer),
&event->overlapped, NULL);