Что такое `conn, addr = s.accept()` в сокете python?

#python #python-3.x #sockets #networking #python-sockets

#питон #python-3.x #сокеты #сеть #python-сокеты

Вопрос:

Я искал документацию и учебные пособия, но никто не говорил об этом, например, это серверный скрипт

 import socket
 
server = socket.socket()
print("socket created")

server.bind(("localhost", 9999))
server.listen(3)
print("waiting for connection")

while True:
    client, addr = server.accept()
    print(client)
    print(addr)
    
    name = client.recv(1024).decode()
    print("connected with", addr, client, name)
    
    client.send(b"welcome bro")       
    client.close()

 
 

При печати client я получаю следующее:

 proto=0, laddr=('127.0.0.1', 9999), raddr=('127.0.0.1', 36182)
 

И addr переменная :

 ('127.0.0.1', 36182)
 

Почему эти две переменные определены одной и получили два разных вывода?

Какова логика за сценой?

Ответ №1:

Из документации подключенного модуля:

socket.accept()

Примите соединение. Сокет должен быть привязан к адресу и прослушивать соединения. Возвращаемое значение представляет собой пару (conn, address), где conn — это новый объект сокета, используемый для отправки и получения данных по соединению, а address — это адрес, привязанный к сокету на другом конце соединения.

Ответ №2:

Скрипт сам по себе не отвечает на этот вопрос, однако я предполагаю, что laddr =(‘127.0.0.1’, 9999) является адресом прослушивания серверного приложения. Именно там устанавливаются соединения. raddr — это порт подключения, с которого поступает запрос. Когда вы прослушиваете порт с сервером, клиент использует любой незащищенный порт> 1024 для подключения к серверу, и это совершенно случайно, если оно определено в клиентском приложении.

Итак, у вас есть разные точки подключения для одного установленного соединения. Один порт и адрес в качестве стороны отправителя (описывается как raddr) и один в качестве стороны получателя (здесь описывается как laddr — для прослушивания)

Это в основном логика любого соединения, связанного с TCP.

Ответ №3:

accept() функция возвращает дескриптор сокета, который подключен к вашему TCP-серверу. В этом случае он возвращает кортеж объектов.

Первый параметр, conn , — это объект сокета, который вы можете использовать для отправки данных и получения данных от подключенного клиента.

Второй параметр, addr , содержит адресную информацию о клиенте, который подключен (например, IP-адрес и удаленная часть).