找回密码
 加入
搜索
查看: 2193|回复: 34

[网络通信] 【已解决】使用TCPListen创建的套接字(socket)可以永久使用吗?

[复制链接]
发表于 2022-10-17 19:40:15 | 显示全部楼层 |阅读模式
本帖最后由 anythinging 于 2022-12-29 18:00 编辑

请教各位朋友 ,遇到个的问题 ,我使用相同的$iListenSocket长期监听一个端口,大约一段时间后该端口会失效,必需重启程序才能正常。
代码结构大致如下,请各位帮看下是否有需要改进的地方?




$sIPAddress = '127.0.0.1'
$iPort = '12345'
TCPStartup()
$iListenSocket = TCPListen($sIPAddress, $iPort)
while 1
        Do
                $Socket = TCPAccept($iListenSocket)
        Until $Socket <> -1
        $sReceived = TCPRecv($Socket, 2048,1)
        ........................................
        ........................................

wend
TCPCloseSocket($iListenSocket)
TCPShutdown()




 楼主| 发表于 2022-10-17 20:21:55 | 显示全部楼层
有时在7-15天左右出现问题,有时会更长一些,目前仍在排查。
发表于 2022-10-17 21:50:07 | 显示全部楼层
TCPAccept 之后判断 @Error ,做失败重连处理不行吗?
 楼主| 发表于 2022-10-17 22:08:02 来自手机 | 显示全部楼层
afan 发表于 2022-10-17 21:50
TCPAccept 之后判断 @Error ,做失败重连处理不行吗?

感谢回复,我检查下代码
发表于 2022-10-18 13:05:07 | 显示全部楼层
会不会是DHCP在7-15天踢掉后重分了IP?电信级的网络接入都有这个问题
 楼主| 发表于 2022-10-18 13:41:13 | 显示全部楼层
afan 发表于 2022-10-17 21:50
TCPAccept 之后判断 @Error ,做失败重连处理不行吗?

您说的失败重连需要关闭TCPListen创建$iListenSocket的再重新监听吗?
如:在TCPAccept失败后,关闭TCPListen创建$iListenSocket,然后再TCPListen重新创建新的套接字进行监听

 楼主| 发表于 2022-10-18 13:42:46 | 显示全部楼层
msold5 发表于 2022-10-18 13:05
会不会是DHCP在7-15天踢掉后重分了IP?电信级的网络接入都有这个问题

应该不是,好象如A版 说的没有对@error,我在官方示例中也看到了@error的处理,可能 在某次整理代码是被我删了
发表于 2022-10-18 15:50:24 | 显示全部楼层
anythinging 发表于 2022-10-18 13:41
您说的失败重连需要关闭TCPListen创建$iListenSocket的再重新监听吗?
如:在TCPAccept失败后,关闭TCPL ...

是的,而且失败重连时最好输出到log记录,以备查看,毕竟7-15天这跨度太大。
 楼主| 发表于 2022-10-18 17:48:48 | 显示全部楼层
afan 发表于 2022-10-18 15:50
是的,而且失败重连时最好输出到log记录,以备查看,毕竟7-15天这跨度太大。

感谢解答,还想请教您推荐用哪种方法比较好?
一、始终使用一个tcplisten的套接字
如题
二、每次接收都新建一个tcplisten的套接字
while 1
       $iListenSocket = TCPListen($sIPAddress, $iPort)
       Do
                $Socket = TCPAccept($iListenSocket)
       Until $Socket <> -1
        $sReceived = TCPRecv($Socket, 2048,1)
        ........................................
        ........................................
        TCPCloseSocket($iListenSocket)
wend
发表于 2022-10-18 18:23:20 | 显示全部楼层
anythinging 发表于 2022-10-18 17:48
感谢解答,还想请教您推荐用哪种方法比较好?
一、始终使用一个tcplisten的套接字
如题

个人认为,如果通讯不是非常频繁的话,还是每次通讯完 TCPCloseSocket 关闭比较好。
发表于 2022-10-19 10:21:08 | 显示全部楼层
我做了一个游戏注册管理器,抄的论坛的代码,通讯用的事件模式,是很稳定的,经过长时间运行的考验。楼主可多在论坛搜索学习
 楼主| 发表于 2022-10-19 22:11:26 | 显示全部楼层
感谢各位的解答,目前暂时已改成方案二进行测试,在while中开启、关闭tcplisten,测试下效果后继续跟进此帖
通过日志统计了下服务端接收的次数,3台主机每秒向服务端发送一次心跳,40多个客户端30秒向服务端发送一次心跳,
目前服务端每24小时的接收响应数量约在30万次以内,不知服务端的响应效率是否会降低。
发表于 2022-10-23 13:50:54 | 显示全部楼层
在 TCPShutdown () 之前应该都能用吧
 楼主| 发表于 2022-10-25 13:09:36 | 显示全部楼层
测试几天发现,使用方案二发现存在客户端连接超时的情况存在,现在又改回方案一了。
服务端端情况 是每秒大约接收处理4个请求并回复信息。
改回方案二后,到目前运行约24小时,客户端还未出现连接超时的情况。
发表于 2022-10-25 14:11:41 | 显示全部楼层
频率这么高当然不需要重连了…… 检查@Error就行
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-4-19 08:36 , Processed in 0.077718 second(s), 20 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表