socket.accept () в python; Как настроить сторону клиента для порта подключения

1

Вместо того, чтобы отправлять мой длинный скрипт, вот краткий пример: я создаю TCP/IP-соединение между двумя компьютерами, каждый из которых запускает один из следующих сценариев:

сервер:

# server.py
import socket

s = socket.socket()
host = socket.gethostname()
port = 1234
s.bind((host, port))

s.listen(5)

while True:
    c, addr = s.accept()
    print 'Connection from', addr
    c.close()

Клиент:

#client.py
import socket

s = socket.socket()

host = socket.socket()
port = 1234

s.connect((host, port))
print s.recv(1024)

который дает мне готовый вид:

Connection from ('19*.1**.0.**', 54451)
Connection from ('19*.1**.0.**', 54452)
Connection from ('19*.1**.0.**', 54453)
Connection from ('19*.1**.0.**', 54454)

Что контролирует создание чисел 54451-54454? Я понимаю, что это такое; номер порта, назначенный для подключения на стороне клиента. Я просто не могу понять, как контролировать число или, по крайней мере, диапазон его выпуска.

Возможно ли это? Любые предложения очень помогли бы. Заранее спасибо.

Теги:
python-3.x

1 ответ

0

Как правило, ваша ОС или система времени выполнения назначают идентификаторы портов, если вы этого не сделали.

В частности, TCP имеет два порта для каждого соединения: порт источника и порт назначения, иногда называемый локальным и удаленным. Использование s.bind устанавливает локальный порт на сервере, не устанавливая ни одного удаленного порта (что имеет смысл: пока нет реального соединения). Использование s.connect устанавливает удаленный (целевой) порт на клиенте, не устанавливая ни одного локального порта.

Когда ваш клиент отправляет запрос на соединение на сервер, вашему клиенту нужен локальный порт. Так как у него еще нет одного, то - система OS или runtime - выбирает один из пула доступных идентификаторов портов. Затем он связывает этот идентификатор с локальной стороной клиентского сокета s и отправляет запрос с (я предполагаю здесь 192.168 RFC-1918)

<local-addr=192.168.xxx.xxx, local-port=54451, remote-addr=S, remote-port=1234>

(где S - IP-адрес сервера).

Сервер видит входящий запрос, создает новый сокет с:

<local-addr=S, local-port=1234, remote-addr=192.168.xxx.xxx, remote-port=54451>

который, как вы можете видеть, это одна и та же пара номеров портов IPaddr +, просто поменялась местами.

Этот новый сокет - это то, что s.accept возвращает на сервере, как c.

Если вы хотите назначить свой собственный локальный порт на клиенте, вы также можете вызвать bind там, прежде чем звонить connect:

s.bind((0, port))

(Zero означает "неназначенный", поэтому это не позволяет локальному IP-адресу отключиться. Вы можете установить конкретный IP-адрес, который полезен, если ваш хост многопользовательский.)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню