首页 新闻 会员 周边 捐助

socket服务端问题

0
悬赏园豆:100 [已解决问题] 解决于 2018-05-11 11:07

c#用完成端口实现的socket服务端

是参考微软SocketAsyncEventArgs的例子实现的,具体看https://msdn.microsoft.com/zh-cn/library/system.net.sockets.socketasynceventargs.aspx 。

并发量可以,但是有一个问题

 

有某几个客户端(客户端不是我们写的),频繁的连接我们的服务端,1分钟内有两千多的连接,而且不释放,导致连接很快占满,而且这些连接都只是发送一次数据就没有再发送了,也就是客户端的行为是 有数据-》另起socket-》发送-》不关闭,下次有数再另起socket,所以我就想在socket服务端另外起一个线程来关闭掉这些超时没发数据的socket连接,但发现还是只能稍微缓解一下,连接池又很快占满了(估计是socket清理的速度还没有socket接收的速度快。然后把socket清理线程优先级调为最高还是不行)

 

请问有高人有解决方案吗

海之殇的主页 海之殇 | 菜鸟二级 | 园豆:500
提问于:2018-05-10 14:15
< >
分享
最佳答案
0

说到底还是要client端去修改,或者你们提供SDK,不然只有一个办法,针对client做计数,然后连接数超过你设定的阈值,就吧这个client所有的连接close,也可以触发之后,将这个client拉取黑名单一会儿,建联的时候直接告知错误不和他玩。逼迫client去完善这个代码。

收获园豆:100
czd890 | 专家六级 |园豆:14488 | 2018-05-11 10:45

提供SDK也是不太可能的,只能给每个客户端设置阈值了

海之殇 | 园豆:500 (菜鸟二级) | 2018-05-11 11:07
其他回答(1)
0

个人想法,不知道行不行的通,没有试验。
当客户端连接时,将它的IP地址和对应的Socket对象存在字典中,当再次连接时,先去字典中判断是否存在这个客户端,有的话直接通讯,没有的话在创建新的Socket对象。要是IP地址改变就没有办法了。
只是简单的想了一下,不知道可不可行,你试试把。

1sa2sa | 园豆:289 (菜鸟二级) | 2018-05-10 17:33
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册