anythinging 发表于 2022-10-17 19:40:15

【已解决】使用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()




anythinging 发表于 2022-10-17 20:21:55

有时在7-15天左右出现问题,有时会更长一些,目前仍在排查。

afan 发表于 2022-10-17 21:50:07

TCPAccept 之后判断 @Error ,做失败重连处理不行吗?

anythinging 发表于 2022-10-17 22:08:02

afan 发表于 2022-10-17 21:50
TCPAccept 之后判断 @Error ,做失败重连处理不行吗?

感谢回复,我检查下代码

msold5 发表于 2022-10-18 13:05:07

会不会是DHCP在7-15天踢掉后重分了IP?电信级的网络接入都有这个问题

anythinging 发表于 2022-10-18 13:41:13

afan 发表于 2022-10-17 21:50
TCPAccept 之后判断 @Error ,做失败重连处理不行吗?

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

anythinging 发表于 2022-10-18 13:42:46

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

应该不是,好象如A版 说的没有对@error,我在官方示例中也看到了@error的处理,可能 在某次整理代码是被我删了

afan 发表于 2022-10-18 15:50:24

anythinging 发表于 2022-10-18 13:41
您说的失败重连需要关闭TCPListen创建$iListenSocket的再重新监听吗?
如:在TCPAccept失败后,关闭TCPL ...

是的,而且失败重连时最好输出到log记录,以备查看,毕竟7-15天这跨度太大。

anythinging 发表于 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

afan 发表于 2022-10-18 18:23:20

anythinging 发表于 2022-10-18 17:48
感谢解答,还想请教您推荐用哪种方法比较好?
一、始终使用一个tcplisten的套接字
如题


个人认为,如果通讯不是非常频繁的话,还是每次通讯完 TCPCloseSocket 关闭比较好。

user3000 发表于 2022-10-19 10:21:08

我做了一个游戏注册管理器,抄的论坛的代码,通讯用的事件模式,是很稳定的,经过长时间运行的考验。楼主可多在论坛搜索学习

anythinging 发表于 2022-10-19 22:11:26

感谢各位的解答,目前暂时已改成方案二进行测试,在while中开启、关闭tcplisten,测试下效果后继续跟进此帖
通过日志统计了下服务端接收的次数,3台主机每秒向服务端发送一次心跳,40多个客户端30秒向服务端发送一次心跳,
目前服务端每24小时的接收响应数量约在30万次以内,不知服务端的响应效率是否会降低。

生于忧患 发表于 2022-10-23 13:50:54

在 TCPShutdown () 之前应该都能用吧

anythinging 发表于 2022-10-25 13:09:36

测试几天发现,使用方案二发现存在客户端连接超时的情况存在,现在又改回方案一了。
服务端端情况 是每秒大约接收处理4个请求并回复信息。
改回方案二后,到目前运行约24小时,客户端还未出现连接超时的情况。

afan 发表于 2022-10-25 14:11:41

频率这么高当然不需要重连了…… 检查@Error就行
页: [1] 2 3
查看完整版本: 【已解决】使用TCPListen创建的套接字(socket)可以永久使用吗?