我的程序要实现两个功能:一是发送广播数据,二是接收广播数据。大致设计是这样的:
我为CMainFrame类增加了两个数据成员:SOCKET  m_RecvSocket,
        m_BroadCastSocket ;并在主窗口的WM_CREATE消息期间创建了这两个套接字,并将m_RecvSocket套接字与INADDR_ANY地址的5000端口绑定,并使用WSAAsyncSelect函数为m_RecvSocket套接字注册了一个FD_READ事件,以便有数据可读时,主窗口会收到消息。然后,我通过一个按钮单击事件发送广播数据报,当使用代码段1发送广播数据时,主窗口能正确的接收到我用WSAAsyncSelect函数注册的FD_READ事件,顺利执行接收代码。代码段1:
    int     ret ;
    char    *msg = "this is xxx!" ;
    SOCKADDR_IN    to ;    to.sin_family = AF_INET;
    to.sin_addr.s_addr = htonl(INADDR_BROADCAST);
    to.sin_port = htons(m_nReceiverPort);
    
    ret = sendto(m_BroadCastSocket, msg, strlen(msg), 
              0, (SOCKADDR *)&to, sizeof(to));
    if (ret == SOCKET_ERROR)
    {
        TRACE("sendto() failed: %d\n", WSAGetLastError());
    }
    else
    {
        TRACE("send ok! \n") ;
    }但是,当我使用代码段2发送广播数据报时,主窗口却不能接收到我注册的FD_READ事件,也就是说,我不能接收广播数据报了!代码段2:
    int      ret ;
    MAILMSG  MSG_Send = {0} ; // MAILMSG是我定义的一个结构
    SOCKADDR_IN    to ;    to.sin_family = AF_INET ;
    to.sin_addr.s_addr = htonl(INADDR_BROADCAST) ;
    to.sin_port = htons(m_nReceiverPort) ;
    
    MSG_Send.mm_dwVersion = CUR_VERSION ;
    MSG_Send.mm_Type = 0x01 ;  // 0x01: 成员资格查询
    MSG_Send.mm_UserInfo = m_LocalUserInfo ;    ret = sendto(m_BroadCastSocket, (char *)&MSG_Send, sizeof(MSG_Send), 0,
             (SOCKADDR *)&to, sizeof(to)) ;    if (ret == SOCKET_ERROR)
    {
        MessageBox("查询在线用户时出现错误!") ;
        return ;
    }
    else
    {
        TRACE("send ok! \n") ;
    }
两个代码段的唯一区别就是:代码段1发送的是一个字符串,而代码段2发送的是一个数据结构。但是不管我使用那一个代码段来发送数据,sendto的返回值都是2264,TRACE语句都会输出“send ok!”,这就是说,发送操作是成功了。可是,为什么使用代码段2来发送数据,就没有FD_READ事件触发呢?我应该如何解决这个问题呢?请帮帮我。谢谢。

解决方案 »

  1.   

    ret = sendto(m_BroadCastSocket, (char *)&MSG_Send, sizeof(MSG_Send), 0,
                 (SOCKADDR *)&to, sizeof(to)) ;上面这种写法非常不严谨,因为结构在内存中排列的顺序对用户来说是不可见的。
    而且sizeof(MSG_Send)是不是0呢??要是0的话,你发送0个字节当然什么也收不到了。
      

  2.   

    1、是楼上兄弟说的原因
    2、请检查是否用WSAANSYCSELECT()函数正确地定了MESSAGE,而MESSAGE是否正确的处理了