救命,重用SOCKET问题?

Sidyhe 2011-03-12 12:47:44
做了那么长时间的网络服务器模型,算是捣鼓个东西出来,现在需要加入新技术,碰到难题了,请各位路过的朋友帮助指点一二.

高效的网络服务器模型目前我知道的技术有四个:IOCP,内存池,线程池,连接池(SOCKET池)

IOCP和内存池我已经做好了,线程池在Win2008以上系统才有最大效率,暂不考虑.

这两天在研究连接池,涉及到[重用SOCKET]这么个玩意.

根据查阅资料所知,连接在发生错误或者断开的时候可以重新利用,使用DisconnectEx,可以重用这个SOCKET.

问题就卡在这里,我的工作线程收到DISCONNECT消息(DisconnectEx也是异步的)收回连接池后,再拿出来AcceptEx就出错.

错误代码是WSAEINVAL,应该是参数错误吧,想来想去,没想出来.

先shutdown,CancelIo也没用.


//投递新的POSTED_ACCEPT请求
pPer_IO_Data = (PPER_IO_OPERATION_DATA)pThis->m_MemPool.Allocate(sizeof(PER_IO_OPERATION_DATA));
pPer_IO_Data->OperType = POSTED_APPECT;
pPer_IO_Data->sClient = pThis->m_SocketPool.GetSocket();
pThis->m_pfnAcceptEx(pThis->m_Socket, pPer_IO_Data->sClient, pPer_IO_Data->AcceptExBuf, 0, sizeof(SOCKADDR_IN) + 16, sizeof(SOCKADDR_IN) + 16, &RecvByte, &pPer_IO_Data->OverLapped);



pPer_IO_Data->OperType = POSTED_DISCONNECT;
pPer_IO_Data->sClient = pPerHandleData->sClient;
pThis->m_pfnDisConnectEx(pPer_IO_Data->sClient, &pPer_IO_Data->OverLapped, TF_REUSE_SOCKET, NULL);


测试系统是Win2003.
大家帮帮我吧,脑袋都想的疼了.................
...全文
640 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
sinarray 2011-05-25
  • 打赏
  • 举报
回复
看看怎样
kkk0438 2011-03-24
  • 打赏
  • 举报
回复
很深奥的问题。。
Sidyhe 2011-03-23
  • 打赏
  • 举报
回复
精巧的iocp web服务器
我去下载了,谢谢提供资料......
WinEggDrop 2011-03-23
  • 打赏
  • 举报
回复
如果你使用DisconnectEx()关闭的socket还处于TIME_WAIT状态,这个socket是不可以被重用的。

Windows TCP reverts to a TIME_WAIT state subsequent to the closing of a connection. While in the TIME_WAIT state, a socket pair cannot be re-used. The TIME_WAIT period is configurable by modifying the following DWORD registry setting that represents the TIME_WAIT period in seconds.

smwhotjay 2011-03-23
  • 打赏
  • 举报
回复
TransmitFile可以的. 网上搜精巧的iocp web服务器. 他写的还可以,就是有点小bug.acceptex.以及重用socket.
TransmitFile. 实在不会,我也没办法了.
Sidyhe 2011-03-22
  • 打赏
  • 举报
回复
楼上的方法不是我预期的,我的意思是一个SOCKET反复使用
andywei1982 2011-03-22
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 zyyoung 的回复:]

连接池,就像我们做线程池一样,事先分配n个线程,繁忙的时候增加,空闲的时候减少。

连接池也可以按这个思路做,关键还是在内存管理上。
[/Quote]


是啊,你先建N个连接,,然后2个队列,一个存放有效的sock,一个存放空闲的,,使用的使用重有效的里面取,然后后台有个线程来管理连接,繁忙的时候增加,空闲的时候减少。
弱水垂钓 2011-03-22
  • 打赏
  • 举报
回复
TransmitFile(hSocket .....)
hSocket
Handle to a connected socket. The TransmitFile function will transmit the file data over this socket. The socket specified by hSocket must be a connection-oriented socket; the TransmitFile function does not support datagram sockets. Sockets of type SOCK_STREAM, SOCK_SEQPACKET, or SOCK_RDM are connection-oriented sockets
hSocket的类型你是怎么设置的呀?
Sidyhe 2011-03-14
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 mayudong1 的回复:]
我理解的连接池都是先建立好多个连接,然后从现有的连接中拿出可用的来用

这个跟socket重用有关系吗
[/Quote]
重用就是避免了频繁的申请SOCKET/释放SOCKET,加快响应速度,减少服务器负荷.

不过我到现在还是没研究个一二三出来,纠结ing......
无水先生 2011-03-14
  • 打赏
  • 举报
回复
没用过连接池(SOCKET池),学习

mayudong1 2011-03-14
  • 打赏
  • 举报
回复
我理解的连接池都是先建立好多个连接,然后从现有的连接中拿出可用的来用

这个跟socket重用有关系吗
zyyoung 2011-03-14
  • 打赏
  • 举报
回复
连接池,就像我们做线程池一样,事先分配n个线程,繁忙的时候增加,空闲的时候减少。

连接池也可以按这个思路做,关键还是在内存管理上。
Sidyhe 2011-03-14
  • 打赏
  • 举报
回复
SOCKET也是一个内核对象,创建/销毁都要经过CPU的特权切换
就好比切换线程的上下文一样,浪费时间
做成"池"可以加快速度
资料上是那么说的,最多的还是数据库的连接池
其实我也在怀疑SOCKET池有没有,或者有没有必要
不过我还是想研究研究
jwybobo2007 2011-03-13
  • 打赏
  • 举报
回复
[Quote=引用楼主 sidyhe 的回复:]
做了那么长时间的网络服务器模型,算是捣鼓个东西出来,现在需要加入新技术,碰到难题了,请各位路过的朋友帮助指点一二.

高效的网络服务器模型目前我知道的技术有四个:IOCP,内存池,线程池,连接池(SOCKET池)

IOCP和内存池我已经做好了,线程池在Win2008以上系统才有最大效率,暂不考虑.

这两天在研究连接池,涉及到[重用SOCKET]这么个玩意.

根据查阅资料所知,……
[/Quote]

你实现socket池目的是什么,为什么要重用,你感觉这么做有什么好处,描述一下

我感觉直接close就可以了,新的连接重新创建就ok了
Sidyhe 2011-03-13
  • 打赏
  • 举报
回复
回楼上的朋友,TransmitFile我也用了,还是没效果.
TransmitPackets这个函数也要搭配使用???
Sidyhe 2011-03-12
  • 打赏
  • 举报
回复
对了,SOCKET在重用之后,AcceptEx之后,还会出现一次POSTED_ACCEPE消息,然后就断开错误了
是不是和完成端口有关系呢???
Damn_boy 2011-03-12
  • 打赏
  • 举报
回复


TransmitFile
TransmitPackets


Flag字段里面设置 TF_DISCONNECT | TF_REUSE_SOCKET


才能重用
_Sodo_ 2011-03-12
  • 打赏
  • 举报
回复
技术有限,先帮你顶下
Sidyhe 2011-03-12
  • 打赏
  • 举报
回复
没人???顶一下...
smwhotjay 2011-03-12
  • 打赏
  • 举报
回复
TransmitFile( mySock, 0, 0, 0, this, 0, TF_DISCONNECT | TF_REUSE_SOCKET );
//可以断开并重用socket.
加载更多回复(1)

18,356

社区成员

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

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