首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

救命,重用SOCKET有关问题

2012-09-04 
救命,重用SOCKET问题?做了那么长时间的网络服务器模型,算是捣鼓个东西出来,现在需要加入新技术,碰到难题了

救命,重用SOCKET问题?
做了那么长时间的网络服务器模型,算是捣鼓个东西出来,现在需要加入新技术,碰到难题了,请各位路过的朋友帮助指点一二.

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

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

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

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

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

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

先shutdown,CancelIo也没用.

C/C++ code
//投递新的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);


C/C++ code
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.
大家帮帮我吧,脑袋都想的疼了.................

[解决办法]
技术有限,先帮你顶下
[解决办法]
这个我也感兴趣,帮顶
[解决办法]
TransmitFile( mySock, 0, 0, 0, this, 0, TF_DISCONNECT | TF_REUSE_SOCKET );
//可以断开并重用socket.
[解决办法]

C/C++ code
TransmitFileTransmitPacketsFlag字段里面设置 TF_DISCONNECT | TF_REUSE_SOCKET
[解决办法]
探讨
做了那么长时间的网络服务器模型,算是捣鼓个东西出来,现在需要加入新技术,碰到难题了,请各位路过的朋友帮助指点一二.

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

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

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

根据查阅资料所知,……

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

连接池也可以按这个思路做,关键还是在内存管理上。
[解决办法]
我理解的连接池都是先建立好多个连接,然后从现有的连接中拿出可用的来用

这个跟socket重用有关系吗
[解决办法]
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的类型你是怎么设置的呀?
[解决办法]
探讨

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

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

[解决办法]
如果你使用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. 




[解决办法]
TransmitFile可以的. 网上搜精巧的iocp web服务器. 他写的还可以,就是有点小bug.acceptex.以及重用socket.
TransmitFile. 实在不会,我也没办法了.

热点排行