做了一个客户端程序连服务器,在线程里面用WSAEventSelect来选择网络事件,实际运行过程中发现客户端对服务器的指令有时根本没反映,(不是每次,只是有时候,但出现频率还是比较高的),我用网络抓包,发现服务器信息已经发到了客户端,但是却没有触发已定义的网络事件了,不知道为什么?请各位帮忙,相关代码如下(省去了具体的数据处理部分),谢谢!!
WSAEVENT Event[1];
WSANETWORKEVENTS NetWorkEvents;
WSAEVENT NewEvent = WSACreateEvent(); int rc = WSAEventSelect(Port->m_CSocket, NewEvent, _READ|FD_WRITE|FD_ACCEPT|FD_CLOSE|FD_CONNECT);
Port->Socket[EventTotal] = Port->m_CSocket;
Event[EventTotal] = NewEvent;
EventTotal++; while(TRUE)
{
Index = WSAWaitForMultipleEvents(EventTotal,Event,false,1000,false);
Index = Index - WSA_WAIT_EVENT_0; if((WSA_WAIT_FAILED == Index) || (WSA_WAIT_TIMEOUT == Index))
{
m_uErr = WSAGetLastError();
continue;
}
//判断网络事件
WSAResetEvent(Event);
Index = Index - WSA_WAIT_EVENT_0;
iResult = WSAEnumNetworkEvents(Port->Socket[0],Even[0],&NetWorkEvents);
if(iResult != 0)
{
m_uErr = WSAGetLastError();
continue;
} //处理网络事件
if(NetWorkEvents.lNetworkEvents & FD_ACCEPT)
{
AfxMessageBox("FD_ACCEPT");
}
//判断是否连接成功
else if(NetWorkEvents.lNetworkEvents & FD_CONNECT)
{
if(NetWorkEvents.iErrorCode[FD_CONNECT_BIT] != 0)
{
AfxMessageBox("FD_CONNECT_Error");
break;
}
//AfxMessageBox("连接成功!"); }
//接受信息
else if(NetWorkEvents.lNetworkEvents & FD_READ)
{
//具体的数据处理
}
else if(NetWorkEvents.lNetworkEvents & FD_WRITE)
{
if(NetWorkEvents.iErrorCode[FD_WRITE_BIT] != 0)
{
AfxMessageBox("FD_WRITE_Error");
break;
}
SetEvent(Port->g_eventSendOk);
}
else if(NetWorkEvents.lNetworkEvents & FD_CLOSE)
{
if(NetWorkEvents.iErrorCode[FD_CLOSE_BIT] != 0)
{
// AfxMessageBox("FD_CLOSE_Error");
//break;
}
}
}
WSAEVENT Event[1];
WSANETWORKEVENTS NetWorkEvents;
WSAEVENT NewEvent = WSACreateEvent(); int rc = WSAEventSelect(Port->m_CSocket, NewEvent, _READ|FD_WRITE|FD_ACCEPT|FD_CLOSE|FD_CONNECT);
Port->Socket[EventTotal] = Port->m_CSocket;
Event[EventTotal] = NewEvent;
EventTotal++; while(TRUE)
{
Index = WSAWaitForMultipleEvents(EventTotal,Event,false,1000,false);
Index = Index - WSA_WAIT_EVENT_0; if((WSA_WAIT_FAILED == Index) || (WSA_WAIT_TIMEOUT == Index))
{
m_uErr = WSAGetLastError();
continue;
}
//判断网络事件
WSAResetEvent(Event);
Index = Index - WSA_WAIT_EVENT_0;
iResult = WSAEnumNetworkEvents(Port->Socket[0],Even[0],&NetWorkEvents);
if(iResult != 0)
{
m_uErr = WSAGetLastError();
continue;
} //处理网络事件
if(NetWorkEvents.lNetworkEvents & FD_ACCEPT)
{
AfxMessageBox("FD_ACCEPT");
}
//判断是否连接成功
else if(NetWorkEvents.lNetworkEvents & FD_CONNECT)
{
if(NetWorkEvents.iErrorCode[FD_CONNECT_BIT] != 0)
{
AfxMessageBox("FD_CONNECT_Error");
break;
}
//AfxMessageBox("连接成功!"); }
//接受信息
else if(NetWorkEvents.lNetworkEvents & FD_READ)
{
//具体的数据处理
}
else if(NetWorkEvents.lNetworkEvents & FD_WRITE)
{
if(NetWorkEvents.iErrorCode[FD_WRITE_BIT] != 0)
{
AfxMessageBox("FD_WRITE_Error");
break;
}
SetEvent(Port->g_eventSendOk);
}
else if(NetWorkEvents.lNetworkEvents & FD_CLOSE)
{
if(NetWorkEvents.iErrorCode[FD_CLOSE_BIT] != 0)
{
// AfxMessageBox("FD_CLOSE_Error");
//break;
}
}
}
解决方案 »
- 关于如何在本程序中屏蔽鼠标的问题,求解答
- CFormView中用Picture控件显示BitMAP图片问题
- 在MFC视图中,如何把当前屏幕上的内容保存为24位的bmp图片?我用的代码一直得到32位的bmp图像
- 怎么取得DateGrid中被选中的值啊······················
- 哪里可以找到OFFICE 2003 style的界面程序
- 模态对话框定位和设置大小问题!!!
- 请问如何在atl下生成一个基于cwnd的非模态对话框
- 阿菜的问题
- 初学者
- 一个关于mscomm控件的提问,请各位帮帮忙!急!拜托拜托!(另一)
- 用vc写的dll用vb调用时出现的问题,急!
- 一个关于打开“无模式”对话框时,如何控制主窗口菜单按钮起不作用的问题
Index = Index - WSA_WAIT_EVENT_0;if((WSA_WAIT_FAILED == Index) || (WSA_WAIT_TIMEOUT == Index))
{
m_uErr = WSAGetLastError();
continue;
}
//////////////////////////////////////////////////////Index = WSAWaitForMultipleEvents(EventTotal,Event,false,1000,false);
if((WSA_WAIT_FAILED == Index) || (WSA_WAIT_TIMEOUT == Index))
{
m_uErr = WSAGetLastError();
continue;
}Index = Index - WSA_WAIT_EVENT_0;
WSAResetEvent(Event)了??谢谢