UDP WSAEventSelect模型 连接客户多时 socket收到数据 WSAWaitForMultipleEvents 没有事件触发

ndsl0827 2012-08-16 05:20:42
如题,目前正在做一个项目,UDP的服务器,采用 WSAEventSelect 模型,服务器 创建一个与客户连接的 socket ,然后

 	m_wsaEventCli = ::WSACreateEvent();
::WSAEventSelect( m_sockClient, m_wsaEventCli, FD_OOB | FD_READ );


服务器创建一个线程,接收向 m_sockClient 发送的数据并处理。

目前程序连接100多个客户能正常运行,但超过150个客户时,
int iReturn = WSAWaitForMultipleEvents( 1, &pDataMgr->GetEventDev(), FALSE, WSA_INFINITE, FALSE );

只有100个客户的事件能触发,剩余的 wsaEventCli 触发不到,是 WSAEventSelect模型 的限制吗?
求高手解答!
...全文
285 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
ndsl0827 2012-08-20
  • 打赏
  • 举报
回复
结贴了,谢谢诸位。大家有什么网络编程方面的好书,推荐一下!
youngwolf 2012-08-17
  • 打赏
  • 举报
回复
你一直在说连接的事,还有什么客户端,我也以为你是tcp。

udp没有什么服务端与客户端的概念。
也没有连接的概念。

你100个套接字同时往1个套接字写数据,这个套接字接收不过来的时候(缓存满),数据就丢失了。所以你的现象是正常的。

至于什么时候缓存满,这个好像不知道。缓存的大小是可以设置的,但你设置得再大,也有可能溢出,这是udp的特点。
ndsl0827 2012-08-17
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]
乍一看还以为是TCP
你这个是UDP啊,本来就不可靠,100多个客户端数据同时发送,接收缓冲区很可能已经溢出了,读出的数据小于150条很正常
[/Quote]
是socket底层的缓冲区吗?那个缓冲区什么有多大,什么时候溢出?服务器连100多个客户算少的了吧
wocow3 2012-08-16
  • 打赏
  • 举报
回复
乍一看还以为是TCP
你这个是UDP啊,本来就不可靠,100多个客户端数据同时发送,接收缓冲区很可能已经溢出了,读出的数据小于150条很正常
ndsl0827 2012-08-16
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
不知道有你说的这个限制。

WSAWaitForMultipleEvents倒是有限制,但你每次只查询一个事件,肯定不会有问题。

可能是事件创建失败了(WSACreateEvent),事件句柄是内核对象,是有限的,但感觉不至于少到100个。

你是不是每个套接字创建一个线程,线程也是内核对象,也是有限的。
[/Quote]

我知道 WSAWaitForMultipleEvents 最多只能等待64个事件触发,如果TCP的服务器要用线程池,但是我采用的UDP通信,所有客户连接我的一个socket上,我等待那个socket上的读事件。
::WSAEventSelect( m_sockClient, m_wsaEventCli, FD_OOB | FD_READ );
ndsl0827 2012-08-16
  • 打赏
  • 举报
回复
To yang79tao
我只有一个接收线程

DWORD WINAPI ThreadProcDevice( LPVOID lpParameter ) //处理设备
{
TRACE(_T("\n处理设备信息线程开始运行!"));
ASSERT(lpParameter);
CDataMgr* pDataMgr = (CDataMgr*)lpParameter;

while(TRUE)
{
int iReturn = WSAWaitForMultipleEvents( 1, &pDataMgr->GetEventDev(), FALSE, WSA_INFINITE, FALSE );
if( iReturn == WSA_WAIT_FAILED || iReturn == WSA_WAIT_TIMEOUT )
{
continue;
}

WSANETWORKEVENTS event;
WSAEnumNetworkEvents( pDataMgr->GetSockDevice(), pDataMgr->GetEventDev(), &event );

if(event.lNetworkEvents & FD_READ)
{
pDataMgr->Recv( TRUE, 1 );
}
else
{
continue;
}
//WSAResetEvent(pDataMgr->GetEventDev());
}
TRACE(_T("\n处理设备信息线程结束!"));
return 0;
}


只能接收到130个左右的客户端数据,多了的话 WSAWaitForMultipleEvents 等待不到事件(只有130个事件能触发)
youngwolf 2012-08-16
  • 打赏
  • 举报
回复
不知道有你说的这个限制。

WSAWaitForMultipleEvents倒是有限制,但你每次只查询一个事件,肯定不会有问题。

可能是事件创建失败了(WSACreateEvent),事件句柄是内核对象,是有限的,但感觉不至于少到100个。

你是不是每个套接字创建一个线程,线程也是内核对象,也是有限的。

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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