【已解决】使用TCPListen创建的套接字(socket)可以永久使用吗?
本帖最后由 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()
有时在7-15天左右出现问题,有时会更长一些,目前仍在排查。 TCPAccept 之后判断 @Error ,做失败重连处理不行吗? afan 发表于 2022-10-17 21:50
TCPAccept 之后判断 @Error ,做失败重连处理不行吗?
感谢回复,我检查下代码 会不会是DHCP在7-15天踢掉后重分了IP?电信级的网络接入都有这个问题 afan 发表于 2022-10-17 21:50
TCPAccept 之后判断 @Error ,做失败重连处理不行吗?
您说的失败重连需要关闭TCPListen创建$iListenSocket的再重新监听吗?
如:在TCPAccept失败后,关闭TCPListen创建$iListenSocket,然后再TCPListen重新创建新的套接字进行监听
msold5 发表于 2022-10-18 13:05
会不会是DHCP在7-15天踢掉后重分了IP?电信级的网络接入都有这个问题
应该不是,好象如A版 说的没有对@error,我在官方示例中也看到了@error的处理,可能 在某次整理代码是被我删了 anythinging 发表于 2022-10-18 13:41
您说的失败重连需要关闭TCPListen创建$iListenSocket的再重新监听吗?
如:在TCPAccept失败后,关闭TCPL ...
是的,而且失败重连时最好输出到log记录,以备查看,毕竟7-15天这跨度太大。 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 anythinging 发表于 2022-10-18 17:48
感谢解答,还想请教您推荐用哪种方法比较好?
一、始终使用一个tcplisten的套接字
如题
个人认为,如果通讯不是非常频繁的话,还是每次通讯完 TCPCloseSocket 关闭比较好。 我做了一个游戏注册管理器,抄的论坛的代码,通讯用的事件模式,是很稳定的,经过长时间运行的考验。楼主可多在论坛搜索学习 感谢各位的解答,目前暂时已改成方案二进行测试,在while中开启、关闭tcplisten,测试下效果后继续跟进此帖
通过日志统计了下服务端接收的次数,3台主机每秒向服务端发送一次心跳,40多个客户端30秒向服务端发送一次心跳,
目前服务端每24小时的接收响应数量约在30万次以内,不知服务端的响应效率是否会降低。 在 TCPShutdown () 之前应该都能用吧 测试几天发现,使用方案二发现存在客户端连接超时的情况存在,现在又改回方案一了。
服务端端情况 是每秒大约接收处理4个请求并回复信息。
改回方案二后,到目前运行约24小时,客户端还未出现连接超时的情况。
频率这么高当然不需要重连了…… 检查@Error就行