我建立客户端事件IO,支持一个SOCKET,当关闭客户端closesokcet,服务器也同样关闭与客户端相连的Socket之后,客户端WSAEnumNetworkEvents返回一直返回10038错误,为什么?
解决方案 »
- winpcap需要哪些包,需要注意什么
- 如何做一个实现ToolTip功能的自定义类?
- RELEASE 下这句话会出错?(DEGUG 下没有问题)
- 在线等:窗口内嵌CFileDialog并挂Hook的问题
- 向各位请教:用什么勾子可以实时获取焦点变换消息?急!
- 界面拖动
- joy0861,你的文件大师里的文件分割的代码可以给我吗?
- 在写一份英文简历,每个项目下面都要些段很长的项目描述Description,共写八个项目,应该每个描述都不同才好,但不知道该怎么写这种描述
- 请问,把一个应用程序移动到另一个位置后,怎样修改注册表才能使这个程序正常的运行?
- 获得了窗口得句柄,这样得到窗口得所处得坐标
- 怎么把pdf文件转换成XML文件
- 求教一个StretchBlt的问题
CClient *pClient = (CClient*)pVoid;
int nIndex, nErr;
char szBuf[MAX_BUF];
int nRecv;
WSANETWORKEVENTS _network;
while(true)
{
nIndex = WaitForSingleObject(pClient->m_wsaEvent, WSA_INFINITE);
if (nIndex == WAIT_OBJECT_0)
{
ZeroMemory(&_network, sizeof(_network));
if (WSAEnumNetworkEvents(pClient->m_sClient, pClient->m_wsaEvent, &_network) == SOCKET_ERROR)
{
nErr = WSAGetLastError();
continue;
}
if (_network.lNetworkEvents == 0)
{
continue;
}
if (_network.lNetworkEvents & FD_CLOSE)
{
//if (network.iErrorCode[FD_CLOSE_BIT] == 0)
{
printf("colse\n");
}
}
else if(_network.lNetworkEvents & FD_CONNECT)
{
if (_network.iErrorCode[FD_CONNECT_BIT] == 0)
{
printf("connected\n");
}
}
else if(_network.lNetworkEvents & FD_READ)
{
if (_network.iErrorCode[FD_READ_BIT] == 0)
{
nRecv = recv(pClient->m_sClient, szBuf, MAX_BUF, 0);
if (nRecv > 0)
{
sNetworkManager.OnRecv(szBuf, nRecv);
}
}
}
}
else /*if (nIndex == WSA_WAIT_FAILED)*/
{
printf("exist\n");
break;
}
}
然后我在主线程里调用closesocket(); nErr = WSAGetLastError();
nerr = 10038
你在主线程中已经调用closesocket,那么socket句柄已经无效了,在工作线程中WSAEnumNetworkEvents的第一个参数已经是无效的socket句柄,所以返回10038的错误,即操作对象不是一个socket。