找回密码
 加入
搜索
楼主: anythinging

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

[复制链接]
 楼主| 发表于 2022-10-25 21:34:09 | 显示全部楼层
afan 发表于 2022-10-25 14:11
频率这么高当然不需要重连了…… 检查@Error就行

请教A版,我发现官方示例中TCPCloseSocket($iListenSocket)这句是在$Socket = TCPAccept($iListenSocket)成功后就直接关闭了,且并不影响接下来的tcprecv和tcpsend
而我的代码是在tcprecv和tcpsend完成后才关闭iListenSocket,这么做是否对效率产生了影响?
 楼主| 发表于 2022-10-26 09:36:37 | 显示全部楼层
目前使用的是方案一,换了个折衷的办法,增加了一个统计接收次数的变量,当变量大于50000时,重启tcplisten。目前还没发现问题 。
发表于 2022-10-26 11:00:58 | 显示全部楼层
anythinging 发表于 2022-10-25 21:34
请教A版,我发现官方示例中TCPCloseSocket($iListenSocket)这句是在$Socket = TCPAccept($iListenSocket) ...

这个没研究过,我没遇到过如此高的频率需求。一般收发通讯一次完毕后就关闭 TCPAccept 和 TCPListen 的套接字。
发表于 2022-11-13 16:29:58 | 显示全部楼层
你们别笑我,对于运行不稳定的事我一般一句搞定,If @error Then Exit Run(@ScriptFullPath)
别看不起这种处理方式,这样子最高效,处处追求完美要很多时间成本

 楼主| 发表于 2022-11-13 16:56:42 | 显示全部楼层
765058729 发表于 2022-11-13 16:29
你们别笑我,对于运行不稳定的事我一般一句搞定,If @error Then Exit Run(@ScriptFullPath)
别看不起这种 ...

感谢回复,主要是在代码方面暂时还没找到什么问题,目前调整了处理顺序,加了几处@error的处理,还在观察。
目前是第四版程序目前在测试环境程序运行已有20天了,成功处理接收消息并回复8312995次,暂时还没出现问题。
主要处理方案是50000次重启一下tcplisten

但是在另一个环境下,把tcplisten重启次数设置为100000次,7天左右出现了一次问题,因此现在弄到第5次改版了,tcplisten改成50000次,在tcplisten,tcpaccept,tcprev部份都加了@error的处理,目前运行了有9天了

主要是这个不彻底解决了,心里总是没底,还得需要时间检验。
 楼主| 发表于 2022-11-13 17:02:50 | 显示全部楼层
本帖最后由 anythinging 于 2022-11-13 17:04 编辑

修改代码过程中,分享一点收获。
把多重if嵌套if语句,改成了容易理解的if return endif,增加了易读性。
要不然时间长了自己还得重新学习一遍思路。
 楼主| 发表于 2022-11-14 21:25:18 | 显示全部楼层
最新进展,经过20天的蹲守,终于有了新的发现。
之前程序是以服务形式运行的,所以端口失效的时候查不到原因,日志也没有记录清楚。
这20天让程序在前台运行,终于出错并有机会看到提示:

Autoit Error
Line 15156 (d:\test\test006.exe)
Error: Subscript used on non-accessible variable


1、各位朋友有知道是什么意思的吗?
2、这种类型的错误能是否通过日志记录查出?
3、如何能根据提示定位代码行数或位置?

实在不行我就用代码运行了
发表于 2022-12-4 11:03:14 | 显示全部楼层
AutoIt 错误
第 15156 行(d:\test\test006.exe)
错误:变量下标不可访问

这通常是没有对返回的变量进行判断是否为数组以及使用的数组元素下标是否超出而出现的问题。
你如果想要输出就要知道是哪里的问题,那还不如提前预防。如果没有预防,这种错误也会导致其它的错误,输出日志继续运行无意义。
定位错误的行数,通常是整合代码后再编译,那样报错的行可以直接在整合的代码中查看。

这贴可以结了,通过测试几十天来重现问题不可取,何况大概率还是缺少基本的判断。
 楼主| 发表于 2022-12-4 11:49:24 | 显示全部楼层
感谢回复,
目前使用代码调试运行约20天,总接收数量为840万次,暂时未出现问题。
小结一下:autoit在长期频繁接收大量tcp连接时,是不需要重启tcplisten的,也就是标题问题是肯定的: TCPListen创建的套接字(socket)可以永久使用

因为目前是代码运行,相信不久会找出是哪个数组的问题。
接下来会断续反馈。
 楼主| 发表于 2022-12-5 08:09:01 | 显示全部楼层
本帖最后由 anythinging 于 2022-12-5 08:33 编辑
afan 发表于 2022-12-4 11:03
AutoIt 错误
第 15156 行(d:\test\test006.exe)
错误:变量下标不可访问

终于相同的情况又发生了,时间好象和上次也差不多,大约是20或21天的样子。
这次的进展在于是用原代码直接运行的,在控制台上发现了是crypt.au3的错误引起的。
"C:\Program Files (x86)\AutoIt3\Include\Crypt.au3" (126) : ==> ???????????.:
If Not $aRet[0] Then $iExtended = _WinAPI_GetLastError()
If Not $aRet^ ??
->00:24:32 AutoIt3.exe 执行脚本结束. 退出码: 1




详细内容
>"C:\Program Files (x86)\AutoIt3\SciTE\AutoIt3Wrapper\AutoIt3Wrapper.exe" /run /prod /ErrorStdOut /in " C:\test\test6.au3" /UserParams 11   
+>22:23:35 启动 AutoIt3Wrapper v.18.708.1148.0 SciTE v.4.1.0.0
键盘:00000804  操作系统:WIN_2016/  CPU:X64  系统架构:X64  语言环境:0804  系统代码页:936    脚本编码: 256 UTF8 无 BOM
SciTE 本机目录 => C:\Program Files (x86)\AutoIt3\SciTEAutoIt3Wrapper 用户目录 => C:\Program Files (x86)\AutoIt3\SciTE\AutoIt3Wrapper
>运行 AU3Check (3.3.14.5)  程序路径: C:\Program Files (x86)\AutoIt3  脚本路径: C:\test\test6.au3
+>22:23:36 AU3Check 语法检查结束. 退出码: 0
!运行: (3.3.14.5):C:\Program Files (x86)\AutoIt3\autoit3_x64.exe " C:\test\test6.au3" 11   
--> 点击 Ctrl+Alt+Break 重新启动, 或点击 Ctrl+Break 停止脚本执行
"C:\Program Files (x86)\AutoIt3\Include\Crypt.au3" (126) : ==> ???????????.:
If Not $aRet[0] Then $iExtended = _WinAPI_GetLastError()
If Not $aRet^ ??
->00:24:32 AutoIt3.exe 执行脚本结束. 退出码: 1
+>00:24:32 AutoIt3Wrapper 完成脚本处理.
>退出代码: 1    耗时: 1.735e+06

按f4定位到了crypt.au3这里




        
调用crypt的方式如下,代码没有记录下错误日志
$a = _Crypt_DecryptData($Text, $Key,$CALG_AES_256)
        If @error Then
                IniWrite ($LogFile,'Log',@YEAR &'-'& @MON &'-'& @MDAY &' '& @HOUR &':'& @MIN &':'& @SEC,'_Crypt_DecryptData is Error,Error Code: '&@error)
        EndIf

        $TextDec = BinaryToString($a)


目前看象是在调用crypt.au3时在某些特定情况下会出错,还请指点。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2022-12-5 10:24:42 | 显示全部楼层
anythinging 发表于 2022-12-5 08:09
终于相同的情况又发生了,时间好象和上次也差不多,大约是20或21天的样子。
这次的进展在于是用原代码直 ...

这是 _Crypt_DeriveKey 函数的书写逻辑错误
将该函数库中所有 If Not $aRet[0] Then $iExtended = _WinAPI_GetLastError() 改为
If IsArray($aRet) And Not $aRet[0] Then $iExtended = _WinAPI_GetLastError()
 楼主| 发表于 2022-12-5 15:33:15 | 显示全部楼层
afan 发表于 2022-12-5 10:24
这是 _Crypt_DeriveKey 函数的书写逻辑错误
将该函数库中所有 If Not $aRet[0] Then $iExtended = _WinA ...

感谢指点!这就照做并进行反馈。
 楼主| 发表于 2022-12-6 18:42:16 | 显示全部楼层
终于看到希望了,感谢A版的指点,目前已按A版方法运行测试并定期反馈。
发表于 2022-12-6 19:01:11 | 显示全部楼层
anythinging 发表于 2022-12-6 18:42
终于看到希望了,感谢A版的指点,目前已按A版方法运行测试并定期反馈。

如果之前出错一直提示的是此问题,那肯定解决了~
虽然出错的只是一行,但发现相同的错误在该函数库中还有很多处,所以让你将所有的问题行均修改替换掉,以绝后患。
发表于 2022-12-7 10:24:00 | 显示全部楼层


加两行:
#AutoIt3Wrapper_Run_Au3Stripper=Y
#Au3Stripper_Parameters=/mo /rsln
编译后在同目录下生成一个stripped.au3文件,如果提xxx行代码有问题,可以直接定位。
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-4-26 13:55 , Processed in 0.079116 second(s), 14 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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