Gắn tới các giao diện
Cho đến giờ, bạn đã thấy 2 khả năng cho địa chỉ IP được sử dụng trong lời gọi bind() cái server
thực hiện. Bạn có thể sử dụng ‘127.0.0.1’ để chỉ ra rằng bạn muốn các gói dữ liệu từ các chương
trình khác chạy trên chỉ cùng một máy, hay bạn có thể sử dụng một chuỗi rỗng ” như một wildcard
để chỉ ra rằng bạn đang sẵn sàng để nhận các gói dữ liệu đi đến server qua bất cứ giao diện mạng
nào.
Có một lựa chọn thứ ba. Bạn có thể cung cấp địa chỉ IP của một trong những giao diện IP bên ngoài
của máy, như kết nối Ethernet hay card không dây, và server sẽ lắng nghe cho chỉ các gói dữ liệu
đích đến cho các IPs đó. Bạn có thể đã nhận thấy code phần trên thực sự cho phép bạn cung cấp một
server chuỗi cho lời gọi bind(), cái sẽ bây giờ để bạn làm một vài thí nghiệm.
Cái gì xảy ra nếu bạn bind duy nhất một giao diện ngoài? Chạy server giống cái này, sử dụng bất cứ gì
hệ điều hành thông báo cho bạn là địa chỉ IP ngoài của hệ thống của bạn.
$ python udp_remote.py server 192.168.5.130
Listening at (‘192.168.5.130’, 1060)
Kết nối với địa chỉ IP này từ một máy khác sẽ vẫn làm việc tốt.
$ python udp_remote.py client guinness
Client socket name is (‘192.168.5.10’, 35084)
Waiting up to 0.1 seconds for a reply
The server says ‘Your data was 23 bytes’
Nhưng nếu bạn thử kết nối tới dịch vụ qua loopback interface bằng cách chạy client script trên cùng máy, các
gói dữ liệu sẽ không bao giờ được phân phát.
$ python udp_remote.py client 127.0.0.1
Client socket name is (‘127.0.0.1’, 60251)
Waiting up to 0.1 seconds for a reply
Traceback (most recent call last):
…
socket.error: [Errno 111] Connection refused
Thực sự thì trên hệ điều hành của tôi ít nhất, kết quả thậm chí tốt hơn các gói dữ liệu không bao giờ được phân
phát. Vì hệ điều hành có thể thấy liệu một trong những cổng của bản thân nó có được mở mà không gửi một gói dữ liệu
qua mạng, nó ngay lập tức trả lời rằng một kết nối tới cổng đó là không thể. Nhưng nhận thức là khả năng này cho UDP
trả về “Connection refused” là siêu khả năng của loopback cái bạn sẽ không bao giờ thấy trên mạng thực. Ở đó gói dữ
liệu phải đơn giản được gửi mà không có chỉ ra liệu có một cổng đích đến để nhận nó.
Thử chạy client một lần nữa trên cùng máy, nhưng lần này sử dụng địa chỉ IP ngoài của máy.
$ python udp_remote.py client 192.168.5.130
Client socket name is (‘192.168.5.130’, 34919)
Waiting up to 0.1 seconds for a reply
The server says ‘Your data was 23 bytes’