Localhost python назначение нескольких переменных - PullRequest
0 голосов
/ 15 марта 2020

У меня есть вопрос. Я пытаюсь понять некоторые сетевые концепции, и я играл с python.

У меня небольшой вопрос. Почему

s = socket.socket(socket.AF_INET6,socket.SOCK_STREAM) # this is always present

это

clientsocket,adress = s.accept() 

отличается от этого?

clientsocket = s.accept()
adress = s.accept()

и я также хочу упомянуть еще одну вещь. Я использовал отладчик для проверки различий между переменными и обнаружил, что clientsocket и s имеют одинаковые атрибуты, но когда я пытаюсь использовать s вместо clientsocket Я получаю сообщение об ошибке. Я бы с удовольствием объяснил. Благодаря.

1 Ответ

0 голосов
/ 15 марта 2020

Из документации :

socket.accept ()

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

Итак, socket.accept () возвращает пару значений. Если вы используете эту форму назначения:

clientsocket, address = s.accept() 

, вы одновременно назначаете обе переменные. Это похоже на

temporary = s.accept()
clientsocket = temporary[0]
address = temporary[1]

, но более эффективно и читабельно. Однако, когда вы делаете

clientsocket = s.accept()
address = s.accept()

, вы вызываете socket.accept () дважды, поэтому сокет client получает сокет от первого вызова, а address получает адрес от второго вызова. Так как результаты двух разных вызовов socket.accept () никак не связаны, клиентский сокет и адрес теперь тоже не связаны. Если вы создаете веб-сервер и два клиента будут пытаться получить страницу с вашего веб-сервера, то clientocket будет соответствовать каналу связи с первым клиентом, а адрес будет содержать адрес второго клиента. Хаос гарантирован.

По поводу вашего второго вопроса - еще раз прочитайте документацию:

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

Исходный сокет представляет собой объект, который вы привязываете к какому-либо порту на вашем компьютере для приема входящего трафика c. Когда приходит запрос на соединение, создается новый объект сокета , который будет представлять вновь созданный канал связи. Оригинальный сокет все еще можно использовать для приема большего количества соединений. Таким образом, объект подключения, возвращаемый функцией socket.accept (), и сам исходный сокет - это разные объекты.

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