@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() возвращает произвольные значения портов?
  • Вопрос задан
  • 173 просмотра
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
ZClick Москва
от 50 000 до 200 000 руб.
Protoplan Краснодар
от 80 000 до 150 000 руб.