服务器非阻塞,循环接收100次。
对UDP不是很熟,没有用select。
客户端发送一次。
求解。

解决方案 »

  1.   

    大致代码如下: // server
    SOCKET sock;
    sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);   
    if (INVALID_SOCKET == sock)   
    {   
    TRACE("Create broadcast socket error,error code:%d\n" ,WSAGetLastError()); 
    return -1;   
    } SOCKADDR_IN addr;
    addr.sin_family = AF_INET;   
    addr.sin_port = htons(8777);   
    addr.sin_addr.s_addr = INADDR_ANY;   
      
    bool bOpt = true;   
    setsockopt(*sock, SOL_SOCKET, SO_BROADCAST, (char*)&bOpt, sizeof(bOpt));   

    int iMode = 1;
    ioctlsocket(*sock,FIONBIO, (u_long FAR*) &iMode); int nRet = bind(sock, (SOCKADDR*)&addr, sizeof(SOCKADDR));   
    if (SOCKET_ERROR == nRet)   
    {   
    TRACE("Bind broadcast socket error,error code:%d\n" ,WSAGetLastError()); 
    return -1;   
    }

    const int sizeBuffLen = 1024;
    char pRecvBuff[sizeBuffLen] = {0};
    int nAddrSize = sizeof(SOCKADDR);

    while(1)
    {
    memset(pRecvBuff ,0 ,sizeBuffLen);

    int nRecSize = recvfrom(sock, pRecvBuff, sizeBuffLen, 0, (SOCKADDR*)&addr, &nAddrSize);   
    if(SOCKET_ERROR == nRecSize)   
    {   
    TRACE("Received broadcast data error,error code:%d\n" ,WSAGetLastError()); 
    return -1;   
    }

    RecvData(pRecvBuff ,nRecSize);
    }
    closesocket(sock);

    //client
    SOCKET sock;
    sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);   
    if (INVALID_SOCKET == sock)   
    {   
    TRACE("Create broadcast socket error,error code:%d\n" ,WSAGetLastError()); 
    return -1;   
    } SOCKADDR_IN addr;
    addr.sin_family = AF_INET;   
    addr.sin_port = htons(8777);   
    addr.sin_addr.s_addr = INADDR_BROADCAST;   
      
    bool bOpt = true;   
    setsockopt(sock, SOL_SOCKET, SO_BROADCAST, (char*)&bOpt, sizeof(bOpt));  

    int nAddrSize = sizeof(SOCKADDR);
    char *pBuff = "test msg";
    int nSendSize = sendto(sock, (const char*)pBuff, strlen(pBuff), 0, (SOCKADDR*)&addr, nAddrSize);
    if(SOCKET_ERROR == nSendSize)   
    {   
    TRACE("Send broadcast data error,error code:%d\n" ,WSAGetLastError());
    return -1;   
    }
    closesocket(sock);
      

  2.   

    你这段代码服务器端收到三个"test msg"?
      

  3.   

    是啊,
    我也不知道为什么会这样。
    RecvData(pRecvBuff ,nRecSize);
    被调用了三次,而且传入的数据都是相同的数据。
    之前的Buffer都有清空。
    我暂时是收到相同数据忽略下面次的数据。
    但是这样就留下了一个Bug。
    哎,实在不知道为啥会这样。
      

  4.   

    最好用网络截包工具看看发包情况,例如wireshark
      

  5.   

    我也遇到这种情况,不过用的是TCP协议,楼主解决掉那个问题没?