Какова вторая часть адреса, возвращаемого recvfrom? - PullRequest
4 голосов
/ 09 августа 2011

Я использую эти 2 фрагмента кода из http://wiki.python.org/moin/UdpCommunication

Сервер:

import socket

UDP_IP="127.0.0.1"
UDP_PORT=5005

sock = socket.socket( socket.AF_INET, # Internet
                      socket.SOCK_DGRAM ) # UDP
sock.bind( (UDP_IP,UDP_PORT) )

while True:
    data, addr = sock.recvfrom( 1024 ) # buffer size is 1024 bytes
    print "received message:", data,"from", addr

Клиент:

import socket

UDP_IP="127.0.0.1"
UDP_PORT=5005
MESSAGE="Hello, World!"

print "UDP target IP:", UDP_IP
print "UDP target port:", UDP_PORT
print "message:", MESSAGE

sock = socket.socket( socket.AF_INET, # Internet
                      socket.SOCK_DGRAM ) # UDP
sock.sendto( MESSAGE, (UDP_IP, UDP_PORT) )

На сервере,Я изменил последнюю строку:

        print "received message:", data,"from", addr

, чтобы она печатала адрес, с которого было отправлено сообщение.В моем macbook порт кажется случайным числом между 40000 или 65000 (я просто уверен, что он кажется случайным).

Есть идеи, что это может быть?

Ответы [ 2 ]

3 голосов
/ 09 августа 2011

Это эфемерный порт , используемый клиентом для отправки данных на сервер.

1 голос
/ 09 августа 2011

Это определенно порт.Вы можете проверить это на стороне отправителя с помощью print sock.getsockname().

Вы также можете сознательно установить его, например, с помощью sock.bind(('', 54312)) перед строкой sock.sendto().

Это может быть полезно в контекстегде программное обеспечение проверяет диапазон портов отправителя: порты 0..1023 являются привилегированными портами - во многих ОС разрешено связывать только эти порты root.

Однако в большинстве случаев нетнеобходимо изменить его, поэтому лучше оставить его таким, каким он есть.

Этот порт имеет значение быть 4-м элементом кортежа, идентифицирующим соединение или аналог соединения.Кортеж: (source_ip, source_port, destination_ip, destination_port).

...