Я использовал шаблон PUSH/PULL
в приложении, и он работает как положено, за исключением случаев, когда я резко выключаю компьютер или отсоединяю кабель ethe rnet в стороне PULL
.
Сторона PUSH
продолжает работать с другими сокетами PULL
, но поддерживает отключенный сокет, как будто он еще жив.
Я изменил параметры TCP (интервал, количество ...) безрезультатно .
Можно ли избежать этого соединения, даже если хост-компьютер выключен или удален кабель ethe rnet?
РЕДАКТИРОВАТЬ:
Это небольшой тест я сделал
server.py
import zmq
import time
context = zmq.Context()
socket = context.socket(zmq.PUSH)
socket.setsockopt(zmq.RCVHWM, 1)
socket.setsockopt(zmq.SNDHWM, 1)
socket.setsockopt(zmq.LINGER, 0)
socket.setsockopt(zmq.IMMEDIATE, 1)
print(socket.sndtimeo)
socket.sndtimeo = 0
socket.setsockopt(zmq.TCP_KEEPALIVE,1)
socket.setsockopt(zmq.TCP_KEEPALIVE_CNT,1)
socket.setsockopt(zmq.TCP_KEEPALIVE_IDLE,1)
socket.setsockopt(zmq.TCP_KEEPALIVE_INTVL,1)
socket.bind('tcp://*:5555')
count= 0
while True:
print('Sending', count)
try:
socket.send(str(count).encode('utf-8'), zmq.NOBLOCK)
count+= 1
print('Ok')
except zmq.error.Again:
print('Error')
time.sleep(0.1)
client.py
import zmq
import time
import sys
#from common import time_utils
context = zmq.Context()
socket = context.socket(zmq.PULL)
server = '127.0.0.1:5555'
try:
server = sys.argv[1]
except IndexError:
pass
socket.setsockopt(zmq.TCP_KEEPALIVE,1)
socket.setsockopt(zmq.TCP_KEEPALIVE_CNT,1)
socket.setsockopt(zmq.TCP_KEEPALIVE_IDLE,1)
socket.setsockopt(zmq.TCP_KEEPALIVE_INTVL,1)
socket.setsockopt(zmq.RCVHWM, 1)
socket.connect(server)
while True:
# Wait for next request from client
message = socket.recv()
print("Received request: ", message)
Запуск одного экземпляра сервера и 2 клиентов (один на той же машине, что запускает сервер и один на другом компьютере). Удаление кабеля ethe rnet второго компьютера приводит к тому, что сервер некоторое время продолжает отправлять сообщения второму клиенту.
Как вы можете видеть, я протестировал все setsockopt
.