Sockets (tiếp tục)
Tiếp theo, server đơn giản này sử dụng lệnh bind() để yêu cầu một địa chỉ mạng UDP, cái
bạn có thể thấy là một Python tuple đơn giản kết hợp một địa chỉ IP str (một hostname, bạn
sẽ thấy sau này, cũng có thể chấp nhận được) và một số cổng UDP int. Bước này có thể thất bại
với một ngoại lệ nếu chương trình khác đã sử dụng cổng UDP đó và server script không thể giành
nó. Thử chạy bản sao khác của server – bạn sẽ thấy nó ra lỗi như sau:
$ python udp_local.py server
Traceback (most recent call last):
…
OSError: [Errno 98] Address already in use
Tất nhiên, có một cơ hội nhỏ rằng bạn nhận ngoại lệ này lần đầu tiên bạn chạy server vì cổng UDP
1060 đã được sử dụng trên máy của bạn. Nó xảy ra rằng tôi thấy bản thân tôi trong một gắn khi chọn
số cổng cho ví dụ đầu tiên này. Nó phải trên 1023, tất nhiên hay bạn không thể chạy script mà không
phải là một quản trị viên hệ thống – và, trong khi tôi thực hiện các scripts ví dụ nhỏ của tôi, tôi
thực sự không muốn khuyến khích con người chạy chúng như quản trị viên hệ thống. Tôi có thể để cho
hệ điều hành chọn số cổng (như tôi đã làm cho client, như bạn thấy một lúc nữa), có server in nó ra,
và sau đó khiến bạn gõ nó vào client như một trong đối số command – line. Tuy nhiên, sau đó tôi sẽ không
đi đến thể hiện cho bạn cú pháp cho yêu cầu một số cổng cụ thể bản thân bạn. Cuối cùng, tôi xem xét
sử dụng một cổng từ phạm vi tạm thời đánh số cao mô tả trước đó, nhưng những cái đó chính xác là các
cổng cái có thể đã sử dụng ngẫu nhiên bởi một vài ứng dụng khác trên máy của bạn, như trình duyệt của bạn
hay SSH client.
Nên lựa chọn duy nhất của tôi dường như là một cổng từ một phạm vi không được biết đến dành riêng trên 1023.
Tôi nhìn vào danh sách và cá rằng, bạn người đọc cao quý không chạy SAP BusinessObjects Polestar trên laptop
hay desktop hay server nơi bạn đang chạy các Python scripts của tôi. Nếu bạn thế, thì thử cung cấp một tuỳ chọn
-p để chọn một số cổng khác.
Chú ý rằng chương trình Python có thể luôn sử dụng một phương thức getsockname() của socket để giành một tuple cái
chứa địa chỉ IP và cổng hiện tại tới nó socket được gắn.