首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网络技术 > 网络协议 >

WSAAsyncSelec 模式 win32 api 客户端连接服务端4次之后,就连不上。解决方案

2012-02-28 
WSAAsyncSelec 模式 win32 api客户端连接服务端4次之后,就连不上。服务端和客户端调试:先运行服务端:第一次

WSAAsyncSelec 模式 win32 api 客户端连接服务端4次之后,就连不上。
服务端和客户端调试:

先运行服务端:第一次客户端连接能连接上,然后关闭客户端。服务端不关闭。
第二次又运得客户端,可以连上,又关闭
这样每次只能进行4次,再连接运行客户端,就连不上了

如果再想连上的话,只能关闭服务端,再运行服务端。以后每次客户端只能连接4次


这是什么原因呀?




[解决办法]
贴代码。
[解决办法]
switch(WSAGETSELECTEVENT(lParam))
{
case FD_ACCEPT: CLSLOG2("case FD_ACCEPT: %d\n",wParam);
Accept = accept(wParam, NULL, NULL);
WSAAsyncSelect(Accept, hWnd, WM_SOCKET,FD_READ|FD_WRITE|FD_CLOSE);//为新的socket注册异步事
n++;
g_pMayiServer->AddSocket(Accept,n);
break;

case FD_READ:
CLSLOG2("case FD_READ: %d\n",wParam);
g_pMayiServer->recvMayi ((LPVOID)wParam);
break;

case FD_WRITE:
//MessageBox(NULL,"有客户断睛 和和 退出","服务端",NULL);
CLSLOG2("case FD_WRITE: %d\n",wParam);
g_pMayiServer->SendToAll (wParam);
break;
case FD_CLOSE: CLSLOG2("case FD_CLOSE: %d\n",wParam);
MessageBox(NULL,"有客户断退出","服务端",NULL);
// g_pMayiServer->EraseSocket(wParam);
closesocket( (SOCKET)wParam);
break;
}
break;

判断一下,每次client连接的时候,server是否走进了accept。而每次断开连接的时候否则走进了close.

另外,你客户端的代码是否错了,没有看到connect啊?

[解决办法]
case FD_CLOSE:
CLSLOG2("case FD_CLOSE: %d\n",wParam);
MessageBox(NULL,"有客户断退出","服务端",NULL);
// g_pMayiServer->EraseSocket(wParam);
closesocket( (SOCKET)wParam);
break;
}

知道你的错误了,你在close的时候关闭的是server的socket。
而不是对应的client的socket。

你把server的socket关闭了,肯定不能再accept了啊!

热点排行