关于IOCP的问题 求助大侠们

Sarah-琦琦 2013-08-25 11:03:15
最近在研究完成端口的问题,看得也不甚调理清晰。可能很多基本的知识点上还有好多漏洞。估计一问全部出来了。请大侠们不吝赐教。感激不尽!


if(!initSockDll())
{
return FALSE;
}
m_hParentWnd = hParentWnd;
m_socketListen = WSASocket(AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, WSA_FLAG_OVERLAPPED);
if (SOCKET_ERROR == m_socketListen)
{
return FALSE;
}
if(bind(m_socketListen,(const sockaddr*)&sockin,sizeof(sockin))==SOCKET_ERROR)
{
StopServer();
return FALSE;
}
//3.listen
if(listen(m_socketListen,SOMAXCONN)==SOCKET_ERROR)
{
StopServer();
return FALSE;
}

//创建完成端口
m_hCompletionPort = CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, 0, 0);

if (INVALID_HANDLE_VALUE == m_hCompletionPort)
{
StopServer();
return FALSE;
}
CreateIoCompletionPort((HANDLE)m_socketListen, m_hCompletionPort, (ULONG_PTR)&m_socketListen, 0);//关联套接字

if (!PostAccept())
{
StopServer();
return FALSE;
}

SYSTEM_INFO sysInfo;
int nThreadNum;
HANDLE hThread;
GetSystemInfo(&sysInfo);

nThreadNum = sysInfo.dwNumberOfProcessors * 2 + 2;
for (int i=0;i<nThreadNum;i++)
{
hThread = CreateThread(NULL, 0, ThreadWatch, this, CREATE_SUSPENDED, NULL);
if (hThread)
{
Sleep(20);
ResumeThread(hThread);
CloseHandle(hThread);
}
}


这个里面的for循环处创建的线程 是不是不管多少个客户端访问服务器都是这样的 个位数的客户端访问是这么多线程上线 若是100个客户端可能同时并发访问服务器 是不是仍然不需要做额外的操作?这段代码仍然是有效的?真的迷糊了,求大侠们多多指教...谢谢
...全文
79 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
Sarah-琦琦 2013-08-26
  • 打赏
  • 举报
回复
引用 7 楼 ananluowei 的回复:
[quote=引用 4 楼 u011061503 的回复:] [quote=引用 3 楼 max_min_ 的回复:] listen是连接未完成的缓冲队列,不是当前连接的个数。如果连接队列满的话,再有客户端请求也就是connect会不成功的。 而且这个数目可以是用户层自己决定的,当然有个最大访问的, ubuntu下/proc/sys/net/core/somaxconn 大小是128的,超过这个设置也就是无效了!
那就是说在这个128个到来的连接范围之内一个listen socket就足够了 那要是超过了这个数的连接 要怎么处理呢?比如像QQ那样肯定不止 这个怎么处理[/quote] listen 的参数是 挂起的连接队列的最大长度,当accept接受1个链接,就会从这个挂起的队列中取走一个。只要一直accept,队列总会空出来位置的。当然如果你不处理accept请求,那么后面客户端就连接不上。[/quote] 嗯 有点像传送带,这头不停地listen 那头不停地 accept 是这么理解的吗?所以其实所能连接的最大客户端的数量跟这个listen的第二个参数并无太大关系。可是我以为这个监听socket 总会有一个上限是它监听不到的...这个上限是由谁决定的?
Sarah-琦琦 2013-08-25
  • 打赏
  • 举报
回复
引用 1 楼 max_min_ 的回复:
首先连多少个客户和你的线程多少个没有多大关系的吧! 然后你的listen(m_socketListen,SOMAXCONN) 你已经有监听的SOMAXCONN,所以这个才是你限制同时排队的客户端个数的! 但是固定开100条线程这处理的不太好吧!可能是特殊的需要一次性开一个线程池的吧! 因为开线程本来就是很浪费资源的 如果不是特殊需要的话, 建议根客户端连上来的根据业务不同再开启不一样的处理线程就好了! 没有处理操作就用不开线程!
那这个listen这块要怎么处理啊 可能确实需要同时监听一百个客户端的请求 而 listen的连接队列里面不是2-4 么 那就是说要开25个listen socket来监听到来的连接?
max_min_ 2013-08-25
  • 打赏
  • 举报
回复
首先连多少个客户和你的线程多少个没有多大关系的吧! 然后你的listen(m_socketListen,SOMAXCONN) 你已经有监听的SOMAXCONN,所以这个才是你限制同时排队的客户端个数的! 但是固定开100条线程这处理的不太好吧!可能是特殊的需要一次性开一个线程池的吧! 因为开线程本来就是很浪费资源的 如果不是特殊需要的话, 建议根客户端连上来的根据业务不同再开启不一样的处理线程就好了! 没有处理操作就用不开线程!
大尾巴猫 2013-08-25
  • 打赏
  • 举报
回复
引用 4 楼 u011061503 的回复:
[quote=引用 3 楼 max_min_ 的回复:] listen是连接未完成的缓冲队列,不是当前连接的个数。如果连接队列满的话,再有客户端请求也就是connect会不成功的。 而且这个数目可以是用户层自己决定的,当然有个最大访问的, ubuntu下/proc/sys/net/core/somaxconn 大小是128的,超过这个设置也就是无效了!
那就是说在这个128个到来的连接范围之内一个listen socket就足够了 那要是超过了这个数的连接 要怎么处理呢?比如像QQ那样肯定不止 这个怎么处理[/quote] listen 的参数是 挂起的连接队列的最大长度,当accept接受1个链接,就会从这个挂起的队列中取走一个。只要一直accept,队列总会空出来位置的。当然如果你不处理accept请求,那么后面客户端就连接不上。
Sarah-琦琦 2013-08-25
  • 打赏
  • 举报
回复
引用 5 楼 max_min_ 的回复:
[quote=引用 4 楼 u011061503 的回复:] [quote=引用 3 楼 max_min_ 的回复:] listen是连接未完成的缓冲队列,不是当前连接的个数。如果连接队列满的话,再有客户端请求也就是connect会不成功的。 而且这个数目可以是用户层自己决定的,当然有个最大访问的, ubuntu下/proc/sys/net/core/somaxconn 大小是128的,超过这个设置也就是无效了!
那就是说在这个128个到来的连接范围之内一个listen socket就足够了 那要是超过了这个数的连接 要怎么处理呢?比如像QQ那样肯定不止 这个怎么处理[/quote] listen是连接未完成的缓冲队列,不是当前连接的个数。如果连接队列满的话,再有客户端请求也就是connect会不成功的 好好体会下,或者再去查查资料看看lislen函数的,好好理解下![/quote] 嗯 好 谢谢
max_min_ 2013-08-25
  • 打赏
  • 举报
回复
引用 4 楼 u011061503 的回复:
[quote=引用 3 楼 max_min_ 的回复:] listen是连接未完成的缓冲队列,不是当前连接的个数。如果连接队列满的话,再有客户端请求也就是connect会不成功的。 而且这个数目可以是用户层自己决定的,当然有个最大访问的, ubuntu下/proc/sys/net/core/somaxconn 大小是128的,超过这个设置也就是无效了!
那就是说在这个128个到来的连接范围之内一个listen socket就足够了 那要是超过了这个数的连接 要怎么处理呢?比如像QQ那样肯定不止 这个怎么处理[/quote] listen是连接未完成的缓冲队列,不是当前连接的个数。如果连接队列满的话,再有客户端请求也就是connect会不成功的 好好体会下,或者再去查查资料看看lislen函数的,好好理解下!
Sarah-琦琦 2013-08-25
  • 打赏
  • 举报
回复
引用 3 楼 max_min_ 的回复:
listen是连接未完成的缓冲队列,不是当前连接的个数。如果连接队列满的话,再有客户端请求也就是connect会不成功的。 而且这个数目可以是用户层自己决定的,当然有个最大访问的, ubuntu下/proc/sys/net/core/somaxconn 大小是128的,超过这个设置也就是无效了!
那就是说在这个128个到来的连接范围之内一个listen socket就足够了 那要是超过了这个数的连接 要怎么处理呢?比如像QQ那样肯定不止 这个怎么处理
max_min_ 2013-08-25
  • 打赏
  • 举报
回复
listen是连接未完成的缓冲队列,不是当前连接的个数。如果连接队列满的话,再有客户端请求也就是connect会不成功的。 而且这个数目可以是用户层自己决定的,当然有个最大访问的, ubuntu下/proc/sys/net/core/somaxconn 大小是128的,超过这个设置也就是无效了!

64,642

社区成员

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

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