UDP-сокеты могут работать в двух разных режимах:
- по умолчанию режим без подключения : все дейтаграммы, отправленные на порт / адрес вашего процесса, получены; вам нужно указывать адрес назначения для каждого отправляемого вами сообщения.
- подключен : принимаются только дейтаграммы, отправленные с адреса / порта, к которому вы подключены; вам не нужно указывать адрес назначения при каждом отправлении.
Вот небольшой обзор подключенных UDP-сокетов .
Edit:
Вот небольшой Python UDP-сервер, который принимает пакеты от любого клиента и копирует их на второй сервер. Все сделано с одним неподключенным сокетом UDP.
#!/usr/bin/env python
import sys, socket, string
if len( sys.argv ) != 4:
print "Usage: udptee <local-listen-port> <copy-host> <copy-port>"
exit( 1 )
copy = ( sys.argv[2], int( sys.argv[3] ))
s = socket.socket( socket.AF_INET, socket.SOCK_DGRAM )
#s.bind(( 'localhost', int( sys.argv[1] )))
s.bind(( '', int( sys.argv[1] )))
print "listening on ", s.getsockname()
print "copying to", copy
while True:
line, addr = s.recvfrom( 1024 )
print "received: ", line, " from ", addr
s.sendto( line, addr ) # echo to source
s.sendto( line, copy ) # copy to tee
if string.strip( line ) == "exit": break
print "Goodbye and thanks for all the fish"
s.close()
Запустите его в одном терминале как:
~$ ./udptee 9090 <IP-of-copy-server> 9999
Затем запустите netcat
в режиме сервера во втором семестре. Этот примет копии дейтаграмм:
# this used to be "nc -ul 127.0.0.1 9999" which only listened on loopback
~$ nc -ul 9999
Запустить netcat
клиента в третий срок, чтобы отправить материал на первый сервер:
~$ nc -u <IP-of-tee-server> 9090
Начните печатать и увидите, что оба сервера отражают то, что вы печатаете.