2015-09-22 3 views
1

В настоящее время я изучаю программирование сокетов на python, и я озадачен тем, как выбирать порты для прослушивания моих серверов. Я знаю, что я не могу выбрать определенный диапазон (до 3000 или что-то?), Поэтому я выбрал порты выше этого номера (точнее, 7777).Как выбрать порт в программировании сокетов?

В моем сценарии я хотел бы протестировать свою программу с использованием различного количества серверов (кратные от 12 до 96). Пока я тестирую свою программу с 12 кодами сервера, назначая хосту localhost и номера портов от 7777 до 7788.

Иногда, когда я запускаю свою программу, питон intepreter говорит:

Traceback (most recent call last): 
    File "/home/myUserName/sockettutorial/sockettest4/ppc1/dir12/nwserver12.py", line 9, in <module> 
    s.bind((host,port)) 
    File "<string>", line 1, in bind 
socket.error: [Errno 98] Address already in use 

несмотря я убил все соответствующие процессы, которые могут по-прежнему слушать указанные порты (с использованием netstat -plan для проверки PIDs этих процессов).

Я включил эту часть в моих кодов сервера:

s.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) 

Моя проблема в том, что, несмотря на ошибки, то программа работает, как ожидалось, а иногда, когда я запускаю свою программу, я не получил это ошибки вообще, и иногда я это делал. Тем не менее, сама по себе ошибка раздражает, и если я хочу избавиться от нее, есть ли способ разрешить машине/хосту назначать доступные порты для серверов или мне нужно их вручную назначить?

Благодарим за ответы!

+0

Когда вы перечисляете все прослушиватели сокетов (например, через 'netstat -a | grep" LISTEN "') в вашей системе, он даже появляется в режиме под названием 'TIME_WAIT'? – HelloWorld

+0

Я не заглянул в детали. Постараюсь сегодня наблюдать и сообщим вам. – KhunWasut

ответ

2

Когда вы привязываете сервер к порту для прослушивания входящих соединений, вам необходимо указать порт. У многих служб есть «стандартный» порт, который они запускают по умолчанию, например. HTTP: 80, HTTPS: 443, SSH: 22. Это значит, что клиенты знают, какой порт отправлять данные при их подключении (если что-то находится на случайном порту, клиент не может подключиться).

Если вы хотите, чтобы ОС выбрала для вас порт, когда вы привязываетесь, вы можете привязать к порту ноль. Затем вы можете узнать, какой порт вы назначили, используя getsockname. Пример:

>>> s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 
>>> s.bind(('127.0.0.1', 0)) 
>>> s.getsockname() 
('127.0.0.1', 42171) 

Номера портов являются короткими int (16 бит), поэтому их диапазон составляет 0-65535. Порты ниже 1000 обычно зарезервированы для «известных» служб, таких как упомянутые выше, и сервисы, обслуживающие их, обычно должны запускаться с правами root.

+0

Это звучит неплохо, поэтому, возможно, можно написать скрипт python для генерации кодов сервера, ориентированных на эти порты, и в то же время подключить к ним код клиента. Я попробую! Спасибо за предложение. – KhunWasut

+0

«Порт 0» используется для прослушивания, чтобы ОС забирала не назначенный порт, и он всегда работает (если нет действительно недоступного порта, что почти невозможно). После того, как слушатель привязан к определенному порту, вы можете прочитать, какой порт был выбран ОС. Discovery-Services может зарегистрировать вашу службу, а затем в локальной сети, чтобы каждый клиент знал номер порта. – HelloWorld

+0

@HelloWorld Спасибо за информацию. Я обновил свой ответ, предложив использовать порт 0. – zstewart

Смежные вопросы