Python3 - [Errno 32] Broken Pipe при использовании сокетов - PullRequest
0 голосов
/ 25 января 2020

У меня есть следующий код для сервера:

import socket
import threading

def handle_client(client_socket):
    request = client_socket.recv(1024)
    print ("[*] Received: %s" % request)
    client_socket.send("ACK!".encode("utf-8"))
    client_socket.close()

bind_ip = "0.0.0.0"
bind_port = 9998
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind((bind_ip, bind_port))
server.listen(5)
print ("[*] Listening on %s:%d" % (bind_ip, bind_port))

while True:
    client, addr = server.accept()
    print ("[*] Accepted connection from: %s:%d" % (addr[0], addr[1]))
    client_handler = threading.Thread(target = handle_client, args = (client))
    client_handler.start()

И следующее на стороне клиента:

def client_sender(buffer):
    client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    client.connect((target, port))
    if len(buffer) > 0:
        client.send(buffer.encode("utf-8"))
        data = client.recv(4096).decode("utf-8")
        print(" - " + data)
    while True:
        buffer = input("Input:")
        buffer += "\n"
        client.send(buffer.encode("utf-8"))
        data = client.recv(4096).decode("utf-8")
        print (" - " + data)

Функция client_sender вызывается другой функцией, где я могу выбрать если прослушать входящее соединение или отправить данные кому-либо. Я назову это так:

python3 filename.py -ip 0.0.0.0 -port 9998

Затем я могу записать некоторые данные. В первый раз, когда я делаю это, я нажимаю CTRL + D, чтобы отправить его, и сервер получает, и клиент получает ответ. Но когда я пытаюсь отправить некоторые данные изнутри «Пока истинно» l oop, сервер никогда не получает их и Я получаю это:

client.send(buffer.encode("utf-8"))
BrokenPipeError: [Errno 32] Broken pipe

Как мне решить эту проблему? Единственное решение, которое я нашел, это работает, это переместить эти две строки внутрь «Пока истинно» l oop:

client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect((target, port))

Однако мне кажется неэффективным повторное подключение каждый раз.

EDIT Как предположил Сэм Мейсон, изменение handle_client следующим образом решает проблему :

def handle_client(client_socket):
    while True:
        request = client_socket.recv(1024).decode("utf-8")
        if len(request):
            print ("[*] Received: %s" % request)
            client_socket.send("ACK!".encode("utf-8"))
        else:
            client_socket.close()
            break

1 Ответ

1 голос
/ 25 января 2020

ваш сервер закрывает порт сразу после одного recv. Я бы посоветовал изменить код handle_client так, чтобы он имел вид while l oop, который заканчивается, когда recv возвращает пустую строку (это означает, что у клиента shutdown конец соединения, вероятно, close в их связи)

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