关于广播数据报接收的问题。
sr388 2003-10-22 04:53:11 我的程序要实现两个功能:一是发送广播数据,二是接收广播数据。
大致设计是这样的:
我为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事件触发呢?
我应该如何解决这个问题呢?请帮帮我。谢谢。