Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ WSARecvFrom目标ip地址_C++_Sockets_Udp - Fatal编程技术网

C++ WSARecvFrom目标ip地址

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

我使用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), &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);