我非常渴望得到一些帮助。
当通过不同服务器上的TCP套接字连接发送大量消息以进行HSM卡验证时,我们遇到问题。
这是我们测试的体积测试: 我们测试了以15转/秒的速度处理了3个30,000个交易的区块,并且在第三个区块交易开始被拒绝。
情况是:
我们认为由于消息量的原因,某些套接字未关闭或超时
以下是代码的要点。
; Open the device
OPEN SOCK:(CONNECT=HOST_":"_PORT_":TCP":DELIMITER=$C(13,10,58,27,95):ATTACH="HSMCLIENT"):TIMOUT:"SOCKET"
ELSE SET ER=1 CLOSE SOCK QUIT "-1"
; Use the socket
USE SOCK
; Write the request. The request message is packed and the bytesteam is written
WRITE HREQ,#
; Read the first two bytes from the socket to identify the length of the reponse
READ BRESP#2:TIMOUT ELSE SET ER=1 CLOSE SOCK QUIT "-1"
; Calculate the length of the incoming data
SET RESPLEN=$A(BRESP,1)_$A(BRESP,2)
; Now read the data of the calculated length
READ BRESP#RESPLEN:TIMOUT ELSE SET ER=1 CLOSE SOCK QUIT "-1"
; Cleanup
CLOSE SOCK
#ENDBYPASS
如果您能提供任何建议或推荐,我们将非常感激。
由于
答案 0 :(得分:0)
当您开始主动关闭时,您最有可能将TIME_WAIT
中的套接字留在HSM上。
由于连接建立速度和TIME_WAIT
周期的持续时间以及有限数量的临时端口,您最终会耗尽可用端口,并且无法再接受任何连接。
您可以通过在完成交易时中止连接(发送RST
而不是FIN
)来避免HSM的套接字进入TIME_WAIT。您可以在关闭连接之前将Linger
选项设置为false,从而在代码中执行此操作。或者你的HSM可能有一个你可以发送的命令,意思是“谢谢你,我已经完成,请关闭连接”,这将允许它启动主动关闭,然后将TIME_WAIT移动到客户端机器(这可能不会如果您有一台客户端计算机,请帮助您,因为您只需从HSM切换问题就无法接受更多连接而无法启动它们......)。