none
接收不到广播数据 RRS feed

  • 问题

  •    调用recvfrom函数接收广播数据,有的广播数据可以接收到,有的接收不到,怎么办?接收不到的是指定发送端口和接收端口的,那个没有绑定发送端口的可以接收到,用wireshark抓包是抓到有数据的,就是VC代码接收不到
    2018年6月21日 6:39

答案

  • Hi,

    感谢在MSDN论坛发帖。

    >>调用recvfrom函数接收广播数据,有的广播数据可以接收到,有的接收不到,怎么办?接收不到的是指定发送端口和接收端口的,那个没有绑定发送端口的可以接收到,用wireshark抓包是抓到有数据的,就是VC代码接收不到

    请提供具体的调用代码以及socket类型,对于这种情况,可以调用WSAGetLastError来查看具体的错误返回信息。

    如果你是面向连接的socket,例如SOCK_STREAM类型。则from和fromlen参数将被忽略。。

    如果from参数非零,并且套接字不是面向连接的(例如键入SOCK_DGRAM),则发送数据的对等方的网络地址将被复制到相应的sockaddr结构中。 fromlen指向的值被初始化为该结构的大小,并在返回时被修改,以指示存储在sockaddr结构中的地址的实际大小。

    具体内容可以参考下面的文档。

    https://msdn.microsoft.com/en-us/library/windows/desktop/ms740120(v=vs.85).aspx

    希望对你有所帮助。

    Best Regards,

    Baron Bi


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    • 已标记为答案 华本庶 2018年7月10日 5:37
    2018年6月22日 8:59
  • WORD wVersionRequested = MAKEWORD(2,2);
    WSADATA wsaData;
    int err = WSAStartup(wVersionRequested, &wsaData);
    if (0 != err){
    AfxMessageBox(_T("can't find a useable winsock"));
    system("pause");
    return -1;
    }
    if (LOBYTE(wsaData.wVersion)!=2 || HIBYTE(wsaData.wVersion)!=2)
    {
    AfxMessageBox(_T("winsock版本不是2.2"));
    system("pause");
    WSACleanup();
    return -1;
    }
    SOCKET sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
    unsigned long arg = 1;
    ioctlsocket(sock, FIONBIO, &arg);
    SOCKADDR_IN sockAdr;
    sockAdr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
    sockAdr.sin_family = AF_INET;
    sockAdr.sin_port = htons(61166);
    BOOL bOpt = TRUE;
    setsockopt(sock, SOL_SOCKET, SO_BROADCAST, (char*)&bOpt, sizeof(bOpt));
    int result = bind(sock, (SOCKADDR*)&sockAdr, sizeof(SOCKADDR));
    int timeout = 1;
    setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, (char*)&timeout, sizeof(timeout));
    setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO, (char*)&timeout, sizeof(timeout));

    BYTE recv_buffer[773];
    memset(recv_buffer, 0, 773);
    SOCKADDR_IN   sockaddr_from;
    sockaddr_from.sin_family = AF_INET;
    sockaddr_from.sin_addr.S_un.S_addr = INADDR_BROADCAST;
    int sockaddr_from_len = sizeof(SOCKADDR_IN);
    int iRet = 0;
    while (TRUE){

    iRet=recvfrom(sock, (char*)recv_buffer, 773, 0, (SOCKADDR*)&sockaddr_from, &sockaddr_from_len)))

          }

    • 已标记为答案 华本庶 2018年7月10日 5:36
    2018年6月28日 6:33

全部回复

  • Hi,

    感谢在MSDN论坛发帖。

    >>调用recvfrom函数接收广播数据,有的广播数据可以接收到,有的接收不到,怎么办?接收不到的是指定发送端口和接收端口的,那个没有绑定发送端口的可以接收到,用wireshark抓包是抓到有数据的,就是VC代码接收不到

    请提供具体的调用代码以及socket类型,对于这种情况,可以调用WSAGetLastError来查看具体的错误返回信息。

    如果你是面向连接的socket,例如SOCK_STREAM类型。则from和fromlen参数将被忽略。。

    如果from参数非零,并且套接字不是面向连接的(例如键入SOCK_DGRAM),则发送数据的对等方的网络地址将被复制到相应的sockaddr结构中。 fromlen指向的值被初始化为该结构的大小,并在返回时被修改,以指示存储在sockaddr结构中的地址的实际大小。

    具体内容可以参考下面的文档。

    https://msdn.microsoft.com/en-us/library/windows/desktop/ms740120(v=vs.85).aspx

    希望对你有所帮助。

    Best Regards,

    Baron Bi


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    • 已标记为答案 华本庶 2018年7月10日 5:37
    2018年6月22日 8:59
  • WORD wVersionRequested = MAKEWORD(2,2);
    WSADATA wsaData;
    int err = WSAStartup(wVersionRequested, &wsaData);
    if (0 != err){
    AfxMessageBox(_T("can't find a useable winsock"));
    system("pause");
    return -1;
    }
    if (LOBYTE(wsaData.wVersion)!=2 || HIBYTE(wsaData.wVersion)!=2)
    {
    AfxMessageBox(_T("winsock版本不是2.2"));
    system("pause");
    WSACleanup();
    return -1;
    }
    SOCKET sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
    unsigned long arg = 1;
    ioctlsocket(sock, FIONBIO, &arg);
    SOCKADDR_IN sockAdr;
    sockAdr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
    sockAdr.sin_family = AF_INET;
    sockAdr.sin_port = htons(61166);
    BOOL bOpt = TRUE;
    setsockopt(sock, SOL_SOCKET, SO_BROADCAST, (char*)&bOpt, sizeof(bOpt));
    int result = bind(sock, (SOCKADDR*)&sockAdr, sizeof(SOCKADDR));
    int timeout = 1;
    setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, (char*)&timeout, sizeof(timeout));
    setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO, (char*)&timeout, sizeof(timeout));

    BYTE recv_buffer[773];
    memset(recv_buffer, 0, 773);
    SOCKADDR_IN   sockaddr_from;
    sockaddr_from.sin_family = AF_INET;
    sockaddr_from.sin_addr.S_un.S_addr = INADDR_BROADCAST;
    int sockaddr_from_len = sizeof(SOCKADDR_IN);
    int iRet = 0;
    while (TRUE){

    iRet=recvfrom(sock, (char*)recv_buffer, 773, 0, (SOCKADDR*)&sockaddr_from, &sockaddr_from_len)))

          }

    • 已标记为答案 华本庶 2018年7月10日 5:36
    2018年6月28日 6:33