关于socket重用的问题

spirit_of_cloud 2013-04-20 05:15:08
各位达人好,刚接触socket编程,一直存在几个疑问。先问第一个。
作为服务端,希望尽可能的提高处理效率,在使用AcceptEx接受一个连接的时候会传入一个事先使用WSASocket创建的套接字对象S。那么当不在需要这个连接的时候,一般的做法是调用CloseSocket来关闭这个套接字S。问题来了,为了提高效率避免再次调用WSASocket重新创建套接字S,有没有一种方式只关闭这个连接,但是不CloseSocket掉这个套接字S,并让其作为AcceptEx的传入参数服务于下一个连接请求?
...全文
732 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiongjunfeng1 2015-03-19
  • 打赏
  • 举报
回复
WinSock2编程之打造完整的SOCKET池 http://wenku.baidu.com/link?url=Ok3fOzNRztu9Y7zAwvt_dy7wtinT5WDPwHP0uh25EPLBfkXqysW7a5-c_hftANE_IdTsyUBddR6rXH2Ccuh-svtXCBqFu8EPojAJDpQCuUO
xiongjunfeng1 2015-03-19
  • 打赏
  • 举报
回复
Socket.Disconnect 方法 ( .NET Framework 2.0 版及其后) 关闭套接字连接并允许重用套接字。 命名空间: System.Net.Sockets 程序集: System(在 System.dll 中) C# public void Disconnect ( bool reuseSocket ) 参数 reuseSocket 如果关闭当前连接后可以重用此套接字,则为 true;否则为 false。 https://msdn.microsoft.com/zh-cn/library/vstudio/system.net.sockets.socket.disconnect(v=vs.100).aspx
qq_24247549 2014-12-05
  • 打赏
  • 举报
回复
所以说 只能 用WSASocket 重建socket对象??? 没办法复用了? 急求解 ! ! !
qq_24247549 2014-12-05
  • 打赏
  • 举报
回复
所以说 只能 用WSASocket 重建socket对象??? 没办法复用了? 急求解
qq_24247549 2014-12-05
  • 打赏
  • 举报
回复
所以说 只能 用WSASocket 重建socket对象??? 没办法复用了? 急求解
wuyiguo 2014-07-18
  • 打赏
  • 举报
回复
说实话,这个确实诡异,如果是同步,因为它只是在调用accept前定义一个socket变量,版主的解释非常好理解;可是AcceptEx是异步的,而异步是先建立socket,也就是先调用wsasocket函数后然后传给AcceptEx的,感觉还是很迷茫。
mrsupersky 2013-11-07
  • 打赏
  • 举报
回复
API在这方面 有些自相矛盾。 据说Close才能 取消WSARecevie的投递,但是,Close之后貌似Socket就不能重用了,那就失去了意义。 而如果不取消投递,那么之前的投递尤其不是一直在那里无法完成,时间长了岂不是相当于资源泄露了。。。。
mrsupersky 2013-11-07
  • 打赏
  • 举报
回复
用DisconnectEx 即可。不过,WSARecive 投递的的不知道怎么取消。查了很多资料,说是没法取消。。。
spirit_of_cloud 2013-04-22
  • 打赏
  • 举报
回复
既然楼主都这么说了,那结贴送分吧,不希望参与的兄弟失望,来者有份。。。
傻X 2013-04-22
  • 打赏
  • 举报
回复
你所说的这个情况之前也有人提过,我只能说楼主你想多了,虽然很深刻的在思考问题。 套接字你可以认为这个是个密钥,客户端和服务器端都绑定了。不同时刻相同IP建立的Socket都不能通信,别说你不同客户端了。 所以说,可以在这里打住了。
spirit_of_cloud 2013-04-22
  • 打赏
  • 举报
回复
引用 6 楼 tiger9991 的回复:
所以我说这个取决于客户端啊,如果客户端还拿之前的AcceptSocket跟你通信,你关闭了就完蛋。 如果客户端开个新的Socket,你之前的也没用。关键看你整体设计的时候,客户端到底怎么连
=============================================================== 在这里首先感谢版主的关注 :) 也许是我没有表述清楚,也许是我对概念理解有问题。 按版主的思路来表述一下我的问题,假设客户A正常关闭了连接。然后在服务器端,我希望能够回收刚刚服务完客户端A的套接字AcceptSocket,然后将此套接字通过函数AcceptEx再次投递到完成端口,准备为再次到来的连接请求(可能来自于客户端B)进行服务。 (为了让问题说的更明白,下面说一下我看到的一般做法。 一般的做法是如果客户端A关闭了连接,服务器端也调用CloseSocket关闭掉刚刚服务于客户端A的AcceptSocket,然后使用WSASocket再次创建一个AcceptSocekt,通过AcceptEx投递到完成端口,准备为下一个客户端的连接请求进行服务) 我的问题是,如何避免在一般做法中对 CloseSocket 和 WSASocket 两个函数的调用,而重复利用一个 AcceptSocket,分别服务于不同的客户端
傻X 2013-04-22
  • 打赏
  • 举报
回复
所以我说这个取决于客户端啊,如果客户端还拿之前的AcceptSocket跟你通信,你关闭了就完蛋。 如果客户端开个新的Socket,你之前的也没用。关键看你整体设计的时候,客户端到底怎么连
spirit_of_cloud 2013-04-22
  • 打赏
  • 举报
回复
引用 4 楼 tiger9991 的回复:
CloseSocket用否取决于你本身业务是长连接和短连接啊。 短的,客户端每次都换Socket,你不关闭也没用啊 长的,必须不能关闭。
=============================================== 我是想实现在服务完这个客户A后,让这个AcceptSocket与客户A断开,然后再通过AcceptEx投递,等待为下一个客户B进行服务,在这期间,不使用CloseSocket函数关闭此AcceptSocket,避免再次调用WSASocket函数所带来的系统开销。
傻X 2013-04-22
  • 打赏
  • 举报
回复
CloseSocket用否取决于你本身业务是长连接和短连接啊。 短的,客户端每次都换Socket,你不关闭也没用啊 长的,必须不能关闭。
spirit_of_cloud 2013-04-22
  • 打赏
  • 举报
回复
引用 1 楼 u010152577 的回复:
listen的socket不需要关闭,可以不断地在 accept中使用,这有很多socket例子,你找一个看看: http://download.csdn.net/detail/geoff08zhang/4571358
==================================================================== 我没说要关闭ListenSocket,我问的是如何对AcceptSocket进行重用。请先看清楚问题。 在网上找了很多,文章和代码,似乎很少有提及重用这个问题并对其讨论的,大部分的做法都是直接CloseSocket。 另外,在MSDN中看到TransmitFile及其替代品DisConnectEx可以实现重用,但是英文只看得个大概,心理没有底希望得到确认。 还有,如果服务器端使用了DisConnectEx,但恶意客户端故意不断开(调用CloseSocket或DisConnectEx),那样的话服务器就会一直出于某种非Closed状态,如何解决这个问题。
smwhotjay 2013-04-21
  • 打赏
  • 举报
回复
有accept后的socket. 通讯完时,不close他.reuse 的操作 .来重用.有个叫fire web http的 貌似用过.
Xiaona_Song 2013-04-21
  • 打赏
  • 举报
回复
listen的socket不需要关闭,可以不断地在 accept中使用,这有很多socket例子,你找一个看看: http://download.csdn.net/detail/geoff08zhang/4571358

18,356

社区成员

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

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