Почему Python 3 TCP Client не закрывает соединение? - PullRequest
0 голосов
/ 23 мая 2019

Я хочу правильно закрыть клиентские соединения в простом чате клиент-сервер, не отключая время ожидания для их закрытия. К сожалению, соединение на сайте клиента не закрывается.

Код сервера

import socket
import sys

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_address = ('localhost', 65432)
sock.bind(server_address)
sock.listen(1)

while True:
    connection, client_address = sock.accept()
    try:
        while True:
            data = connection.recv(1024)
            print(data)
            if data:
                connection.sendall(data)
            else:
                break

    finally:
        connection.close()

Код клиента

import socket
import time

HOST = '127.0.0.1'
PORT = 65432

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))
s.sendall(b'Hello world')

data = s.recv(1024)
print('Received', data)
time.sleep(5)
#s.sendall('Hello world, again'.encode())
s.close()

Запуск сервера приводит к:

tcp    LISTEN   0    1    127.0.0.1:65432    0.0.0.0:* 

После запуска клиента я ожидал того же состояния, но клиентское соединение открыто.

tcp   LISTEN    0    1   127.0.0.1:65432    0.0.0.0:*                  
tcp   TIME-WAIT   0    0    127.0.0.1:57794    127.0.0.1:65432

НО, если я раскомментирую следующую строку:

#s.sendall('Hello world, again'.encode())

Результат, как я и ожидал.

tcp    LISTEN   0    1    127.0.0.1:65432    0.0.0.0:* 

Почему соединение мгновенно закрывается с повторной отправкой данных и без тайм-аута?

1 Ответ

1 голос
/ 23 мая 2019

TCP - это надежный протокол. Даже если клиент отправляет данные и закрывает соединение, соединение поддерживается в течение некоторого периода времени в случае необходимости повторной передачи пакетов данных. TIME_WAIT исчезнет через несколько минут. Существует опция SO_LINGER, которая может контролировать время ожидания.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...