WSAEventSelect模型下何时触发FD_CLOSE

cll131421 2014-11-28 05:40:04
最近在学习网络编程中的WSAEventSelect模型,其他都还好,就是无法触发FD_CLOSE事件,导致服务器端的连接无法关闭。
请教各位高手指教。
直接上代码:
#include <iostream>
#include "InitSocket.h"

#pragma comment (lib,"ws2_32.lib")

//初始化网络环境
CInitSocket gcInitSocket;

void main()
{
SOCKET sServer = socket(AF_INET,SOCK_STREAM,0);
if (INVALID_SOCKET == sServer)
{
printf("创建服务器套接字失败,错误编号:%d\n",WSAGetLastError());
exit(0);
}
sockaddr_in addrBind;
addrBind.sin_family = AF_INET;
addrBind.sin_addr.S_un.S_addr = htonl(ADDR_ANY);
addrBind.sin_port = htons(8080);
int iBind = bind(sServer,(sockaddr*)&addrBind,sizeof(sockaddr));
if (SOCKET_ERROR == iBind)
{
printf("bind failed\n");
exit(0);
}
int iListen = listen(sServer,SOMAXCONN);
if (SOCKET_ERROR == iListen)
{
printf("listen failed\n");
exit(0);
}
WSAEVENT eventArr[WSA_MAXIMUM_WAIT_EVENTS];
SOCKET socketArr[WSA_MAXIMUM_WAIT_EVENTS];
int iArrSize = 0;
WSAEVENT eventForSRV = WSACreateEvent();
eventArr[iArrSize] = eventForSRV;
socketArr[iArrSize] = sServer;
++iArrSize;
if (WSA_INVALID_EVENT == eventForSRV)
{
printf("create wsaevent failed\n");
exit(0);
}
WSAEventSelect(sServer,eventForSRV,FD_ACCEPT | FD_CLOSE);
while (1)
{
int iIndex = WSAWaitForMultipleEvents(iArrSize,eventArr,false,INFINITE,false);
if (WSA_WAIT_FAILED == iIndex || WSA_WAIT_TIMEOUT == iIndex)
{
continue;
}
iIndex -= WSA_WAIT_EVENT_0;
for (int i = iIndex;i!=iArrSize;++i)
{
iIndex = WSAWaitForMultipleEvents(1,&eventArr[i],true,1000,false);
if (WSA_WAIT_FAILED == iIndex || WSA_WAIT_TIMEOUT == iIndex)
{
continue;
}
else
{
WSANETWORKEVENTS eventTmp;
WSAEnumNetworkEvents(socketArr[i],eventArr[i],&eventTmp);
if (eventTmp.lNetworkEvents & FD_ACCEPT)
{
if (eventTmp.iErrorCode[FD_ACCEPT_BIT] != 0)
{
continue;
}
sockaddr_in addrAccept;
int iLength = sizeof(sockaddr);
SOCKET sAccept = accept(socketArr[i],(sockaddr*)&addrAccept,&iLength);
WSAEVENT eventAccept = WSACreateEvent();
printf("IP:%s,端口:%d\n",inet_ntoa(addrAccept.sin_addr),ntohs(addrAccept.sin_port));
WSAEventSelect(sAccept,eventAccept,FD_READ || FD_WRITE || FD_CLOSE);
socketArr[iArrSize] = sAccept;
eventArr[iArrSize] = eventAccept;
++iArrSize;
}
else if (eventTmp.lNetworkEvents & FD_READ)
{
if (0 != eventTmp.iErrorCode[FD_READ_BIT])
{
continue;
}
char chRecv[200] = {0};
int iRecv = recv(socketArr[i],chRecv,200,0);
if (SOCKET_ERROR == iRecv)
{
printf("recv failed\n");
continue;
}
printf("%s\n",chRecv);
}
else if (eventTmp.lNetworkEvents & FD_CLOSE)
{
// if (0 != eventTmp.iErrorCode[FD_CLOSE_BIT])
// {
// continue;
// }
closesocket(socketArr[i]);
for (int i2 = i;i2!=iArrSize - 1;++i2)
{
socketArr[i] = socketArr[i + 1];
eventArr[i] = eventArr[i + 1];
}
--iArrSize;
printf("one client closed\n");
}
}
}
}
}
...全文
294 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
cll131421 2014-11-29
  • 打赏
  • 举报
回复
引用 1 楼 lovesmiles 的回复:
In TCP terms, this means that the FD_CLOSE is recorded when the connection goes into the TIME WAIT or CLOSE WAIT states. This results from the remote end performing a shutdown on the send side or a closesocket. 连接超时 或者发送方调用了shutdown 或者closesocket
我测试的时候客户端关闭无法触发该信号,导致服务器端的连接数量不停增大。怎么破?
cll131421 2014-11-29
  • 打赏
  • 举报
回复
引用 1 楼 lovesmiles 的回复:
In TCP terms, this means that the FD_CLOSE is recorded when the connection goes into the TIME WAIT or CLOSE WAIT states. This results from the remote end performing a shutdown on the send side or a closesocket. 连接超时 或者发送方调用了shutdown 或者closesocket
客户端关闭会引发该么?
勤奋的小游侠 2014-11-28
  • 打赏
  • 举报
回复
In TCP terms, this means that the FD_CLOSE is recorded when the connection goes into the TIME WAIT or CLOSE WAIT states. This results from the remote end performing a shutdown on the send side or a closesocket. 连接超时 或者发送方调用了shutdown 或者closesocket

64,687

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧