使用卷事务的TCP套接字连接超时

时间:2010-09-22 22:32:40

标签: tcp timeout volume

我非常渴望得到一些帮助。

当通过不同服务器上的TCP套接字连接发送大量消息以进行HSM卡验证时,我们遇到问题。

这是我们测试的体积测试: 我们测试了以15转/秒的速度处理了3个30,000个交易的区块,并且在第三个区块交易开始被拒绝。

情况是:

  1. 我们成功处理了第1区和第2区,成功完成了30,000笔交易。
  2. 在第三个区块,系统成功处理了8,000个交易,之后与HSM的连接被阻止。
  3. 我们看到所有HSM套接字都已被使用,因此交易被拒绝。
  4. 我们认为由于消息量的原因,某些套接字未关闭或超时

    以下是代码的要点。

        ; 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
    

    如果您能提供任何建议或推荐,我们将非常感激。

    由于

1 个答案:

答案 0 :(得分:0)

当您开始主动关闭时,您最有可能将TIME_WAIT中的套接字留在HSM上。

由于连接建立速度和TIME_WAIT周期的持续时间以及有限数量的临时端口,您最终会耗尽可用端口,并且无法再接受任何连接。

您可以通过在完成交易时中止连接(发送RST而不是FIN)来避免HSM的套接字​​进入TIME_WAIT。您可以在关闭连接之前将Linger选项设置为false,从而在代码中执行此操作。或者你的HSM可能有一个你可以发送的命令,意思是“谢谢你,我已经完成,请关闭连接”,这将允许它启动主动关闭,然后将TIME_WAIT移动到客户端机器(这可能不会如果您有一台客户端计算机,请帮助您,因为您只需从HSM切换问题就无法接受更多连接而无法启动它们......)。