Тайм-аут соединения через сокет TCP - PullRequest
0 голосов
/ 23 сентября 2010

Я отчаянно нуждаюсь в помощи по этому вопросу.

У нас возникают проблемы при отправке тома сообщений через TCP Socket Connection на другой сервер для проверки карты HSM.

Вот что мы тестировали для объемного тестирования: Мы протестировали с обработкой 3 блоков по 30 000 транзакций со скоростью 15 транзакций в секунду, а в третьем блоке транзакции начали отклоняться.

Ситуация была:

  1. Мы успешно обработали блоки 1 и 2 с 30 000 транзакций.
  2. В третьем блоке система только что успешно обработала 8 000 транзакций, после чего соединения с HSM были заблокированы.
  3. Мы увидели, что все сокеты HSM использовались, поэтому транзакции были отклонены.

Мы думаем, что некоторые сокеты не закрыты или не имеют тайм-аут из-за объема сообщений

Ниже суть кода.

    ; 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 голосов
/ 23 сентября 2010

Скорее всего, вы оставляете сокеты в TIME_WAIT на HSM, когда вы инициируете активное закрытие.

Из-за скорости установления соединения и продолжительности периода TIME_WAIT иограниченное количество временных портов, которые вы в конечном итоге исчерпали из доступных портов и больше не можете принимать соединения.

Вы можете избежать попадания сокета HSM в TIME_WAIT, прерывая ваше соединение по завершении транзакции (отправка RST, а не FIN).Вы делаете это в коде, установив для параметра Linger значение false перед закрытием соединения.В качестве альтернативы ваш HSM может иметь команду, которую вы можете отправить, что означает «спасибо за это, я сделал, пожалуйста, закройте соединение», что позволит ему инициировать активное закрытие и затем переместить TIME_WAIT на клиентские машины (это может непомогите, если у вас один клиентский компьютер, так как вы просто переключите проблему с HSM, не имея возможности принимать больше соединений, из-за того, что вы не можете их инициировать ...).

...