@Drovosek01

Почему socket.accept() в Python возвращает произвольный порт?

Пытаюсь разобраться в модуле socket. Чуть-чуть модифицировал код от сюда: https://andreymal.org/socket3/ чтобы addr возвращался весь.

import time
import socket

def send_answer(conn, status="200 OK", typ="text/plain; charset=utf-8", data=""):
    data = data.encode("utf-8")
    conn.send(b"HTTP/1.1 " + status.encode("utf-8") + b"\r\n")
    conn.send(b"Server: simplehttp\r\n")
    conn.send(b"Connection: close\r\n")
    conn.send(b"Content-Type: " + typ.encode("utf-8") + b"\r\n")
    conn.send(b"Content-Length: " + bytes(len(data)) + b"\r\n")
    conn.send(b"\r\n")# после пустой строки в HTTP начинаются данные
    conn.send(data)

def parse(conn, addr):# обработка соединения в отдельной функции
    data = b""

    while not b"\r\n" in data: # ждём первую строку
        tmp = conn.recv(1024)
        if not tmp:   # сокет закрыли, пустой объект
            break
        else:
            data += tmp

    if not data:      # данные не пришли
        return        # не обрабатываем

    udata = data.decode("utf-8")

    # берём только первую строку
    udata = udata.split("\r\n", 1)[0]
    # разбиваем по пробелам нашу строку
    method, address, protocol = udata.split(" ", 2)

    if method != "GET" or address != "/time.html":
        send_answer(conn, "404 Not Found", data="Не найдено")
        return

    answer = """<!DOCTYPE html>"""
    answer += """<html><head><title>Время</title></head><body><h1>"""
    answer += time.strftime("%H:%M:%S %d.%m.%Y")
    answer += """</h1></body></html>"""

    send_answer(conn, typ="text/html; charset=utf-8", data=answer)


sock = socket.socket()
sock.bind( ("", 8080) )
sock.listen(5)

try:
    while 1: # работаем постоянно
        conn, addr = sock.accept()
        # print("New connection from " + addr[0])
        print("New connection from " + str(addr))
        try:
            parse(conn, addr)
        except:
            send_answer(conn, "500 Internal Server Error", data="Ошибка")
        finally:
            # так при любой ошибке
            # сокет закроем корректно
            conn.close()
finally: sock.close()
# так при возникновении любой ошибки сокет
# всегда закроется корректно и будет всё хорошо


Запускаю скрипт, захожу на localhost:8080, смотрю в консоль, а там accept() возвращает адреса с произвольными портами, хотя я же серверу сказал слушать порт 8080 и с клиента (с браузера) захожу подключаюсь к порту 8080.
Почему accept() возвращает произвольные значения портов?
  • Вопрос задан
  • 515 просмотров
Пригласить эксперта
Ответы на вопрос 1
@dmn_202_01
Я думаю что он возвращает порт с которого происходил запрос на твой сервер. Про перенаправление портов прочитай.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы