socket --- Giao diện mạng cấp thấp

Source code: Lib/socket.py


Mô-đun này cung cấp quyền truy cập vào giao diện BSD socket. Nó có sẵn trên tất cả các hệ thống Unix, Windows, MacOS hiện đại và có thể cả các nền tảng bổ sung.

Ghi chú

Một số hành vi có thể phụ thuộc vào nền tảng vì lệnh gọi được thực hiện tới API socket của hệ điều hành.

sẵn có: not WASI.

Mô-đun này không hoạt động hoặc không có trên WebAssembly. Xem Nền tảng WebAssugging để biết thêm thông tin.

Giao diện Python là phiên âm đơn giản của giao diện thư viện và lệnh gọi hệ thống Unix dành cho các ổ cắm sang kiểu hướng đối tượng của Python: hàm socket() trả về một socket object có các phương thức thực hiện các lệnh gọi hệ thống ổ cắm khác nhau. Các loại tham số ở cấp độ cao hơn một chút so với trong giao diện C: như với các hoạt động read()write() trên các tệp Python, việc phân bổ bộ đệm cho các hoạt động nhận là tự động và độ dài bộ đệm được ẩn trong các hoạt động gửi.

Xem thêm

Mô-đun socketserver

Các lớp đơn giản hóa việc viết các máy chủ mạng.

Mô-đun ssl

Trình bao bọc TLS/SSL cho các đối tượng socket.

Họ ổ cắm

Tùy thuộc vào hệ thống và các tùy chọn xây dựng, các dòng ổ cắm khác nhau được mô-đun này hỗ trợ.

Định dạng địa chỉ mà một đối tượng socket cụ thể yêu cầu sẽ tự động được chọn dựa trên họ địa chỉ được chỉ định khi đối tượng socket được tạo. Địa chỉ socket được biểu diễn như sau:

  • Địa chỉ của ổ cắm AF_UNIX được liên kết với nút hệ thống tệp được biểu diễn dưới dạng chuỗi, sử dụng mã hóa hệ thống tệp và trình xử lý lỗi 'surrogateescape' (xem PEP 383). Một địa chỉ trong không gian tên trừu tượng của Linux được trả về dưới dạng bytes-like object với byte rỗng ban đầu; lưu ý rằng các ổ cắm trong không gian tên này có thể giao tiếp với các ổ cắm hệ thống tệp thông thường, vì vậy các chương trình dự định chạy trên Linux có thể cần phải xử lý cả hai loại địa chỉ. Một đối tượng giống như chuỗi hoặc byte có thể được sử dụng cho một trong hai loại địa chỉ khi chuyển nó làm đối số.

    Thay đổi trong phiên bản 3.3: Trước đây, đường dẫn ổ cắm AF_UNIX được cho là sử dụng mã hóa UTF-8.

    Thay đổi trong phiên bản 3.5: bytes-like object có thể ghi hiện đã được chấp nhận.

  • Một cặp (host, port) được sử dụng cho họ địa chỉ AF_INET, trong đó host là một chuỗi biểu thị tên máy chủ theo ký hiệu tên miền internet như 'daring.cwi.nl' hoặc địa chỉ IPv4 như '100.50.200.5'port là một số nguyên.

    • Đối với địa chỉ IPv4, hai dạng đặc biệt được chấp nhận thay vì địa chỉ máy chủ: '' đại diện cho INADDR_ANY, được sử dụng để liên kết với tất cả các giao diện và chuỗi '<broadcast>' đại diện cho INADDR_BROADCAST. Hành vi này không tương thích với IPv6, do đó, bạn có thể muốn tránh những điều này nếu bạn có ý định hỗ trợ IPv6 với các chương trình Python của mình.

  • Đối với họ địa chỉ AF_INET6, một (host, port, flowinfo, scope_id) gồm bốn bộ được sử dụng, trong đó flowinfoscope_id đại diện cho các thành viên sin6_flowinfosin6_scope_id trong struct sockaddr_in6 trong C. Đối với các phương thức mô-đun socket, flowinfoscope_id có thể được bỏ qua chỉ để tương thích ngược. Tuy nhiên, xin lưu ý rằng việc thiếu scope_id có thể gây ra sự cố khi thao tác các địa chỉ IPv6 trong phạm vi.

    Thay đổi trong phiên bản 3.7: Đối với các địa chỉ multicast (với scope_id có ý nghĩa), address có thể không chứa phần %scope_id (hoặc zone id). Thông tin này là không cần thiết và có thể được bỏ qua một cách an toàn (được khuyến nghị).

  • Ổ cắm AF_NETLINK được biểu diễn dưới dạng cặp (pid, groups).

  • Hỗ trợ chỉ dành cho Linux cho TIPC có sẵn bằng cách sử dụng họ địa chỉ AF_TIPC. TIPC là một giao thức mạng mở, không dựa trên IP được thiết kế để sử dụng trong môi trường máy tính tập trung. Địa chỉ được biểu thị bằng một bộ dữ liệu và các trường phụ thuộc vào loại địa chỉ. Dạng bộ dữ liệu chung là (addr_type, v1, v2, v3 [, scope]), trong đó:

    • addr_type là một trong các TIPC_ADDR_NAMESEQ, TIPC_ADDR_NAME hoặc TIPC_ADDR_ID.

    • scope là một trong TIPC_ZONE_SCOPE, TIPC_CLUSTER_SCOPETIPC_NODE_SCOPE.

    • Nếu addr_typeTIPC_ADDR_NAME thì v1 là loại máy chủ, v2 là mã định danh cổng và v3 phải là 0.

      Nếu addr_typeTIPC_ADDR_NAMESEQ thì v1 là loại máy chủ, v2 là số cổng dưới và v3 là số cổng trên.

      Nếu addr_typeTIPC_ADDR_ID thì v1 là nút, v2 là tham chiếu và v3 phải được đặt thành 0.

  • Một bộ (interface, ) được sử dụng cho họ địa chỉ AF_CAN, trong đó interface là một chuỗi đại diện cho tên giao diện mạng như 'can0'. Tên giao diện mạng '' có thể được sử dụng để nhận các gói từ tất cả các giao diện mạng thuộc họ này.

    • Giao thức CAN_ISOTP yêu cầu một bộ (interface, rx_addr, tx_addr) trong đó cả hai tham số bổ sung đều là số nguyên dài không dấu đại diện cho mã định danh CAN (tiêu chuẩn hoặc mở rộng).

    • Giao thức CAN_J1939 yêu cầu một bộ (interface, name, pgn, addr) trong đó các tham số bổ sung là số nguyên không dấu 64 bit biểu thị tên ECU, số nguyên không dấu 32 bit biểu thị Số nhóm tham số (PGN) và số nguyên 8 bit biểu thị địa chỉ.

  • Một chuỗi hoặc một bộ (id, unit) được sử dụng cho giao thức SYSPROTO_CONTROL của họ PF_SYSTEM. Chuỗi này là tên của điều khiển hạt nhân sử dụng ID được gán động. Bộ dữ liệu có thể được sử dụng nếu ID và số đơn vị của điều khiển hạt nhân được biết hoặc nếu ID đã đăng ký được sử dụng.

    Added in version 3.3.

  • AF_BLUETOOTH hỗ trợ các giao thức và định dạng địa chỉ sau:

    • BTPROTO_L2CAP chấp nhận một bộ (bdaddr, psm[, cid[, bdaddr_type]]) trong đó:

      • bdaddr là một chuỗi chỉ định địa chỉ Bluetooth.

      • psm là một số nguyên chỉ định Bộ ghép kênh giao thức/dịch vụ.

      • cid là số nguyên tùy chọn chỉ định Mã nhận dạng kênh. Nếu không được đưa ra, mặc định là 0.

      • bdaddr_type là số nguyên tùy chọn chỉ định loại địa chỉ; một trong BDADDR_BREDR (mặc định), BDADDR_LE_PUBLIC, BDADDR_LE_RANDOM.

      Thay đổi trong phiên bản 3.14: Đã thêm các trường cidbdaddr_type.

    • BTPROTO_RFCOMM chấp nhận (bdaddr, channel) trong đó bdaddr là địa chỉ Bluetooth dưới dạng chuỗi và channel là số nguyên.

    • BTPROTO_HCI chấp nhận định dạng tùy thuộc vào hệ điều hành của bạn.

      • Trên Linux, nó chấp nhận một số nguyên device_id hoặc một bộ (device_id, [channel]) trong đó device_id chỉ định số lượng thiết bị Bluetooth và channel là một số nguyên tùy chọn chỉ định kênh HCI (HCI_CHANNEL_RAW theo mặc định).

      • Trên FreeBSD, NetBSD và DragonFly BSD, nó chấp nhận bdaddr trong đó bdaddr là địa chỉ Bluetooth dưới dạng chuỗi.

      Thay đổi trong phiên bản 3.2: Đã thêm hỗ trợ NetBSD và DragonFlyBSD.

      Thay đổi trong phiên bản 3.13.3: Đã thêm hỗ trợ FreeBSD.

      Thay đổi trong phiên bản 3.14: Đã thêm trường channel. device_id không được đóng gói trong bộ dữ liệu hiện được chấp nhận.

    • BTPROTO_SCO chấp nhận bdaddr trong đó bdaddr là địa chỉ Bluetooth dưới dạng chuỗi hoặc đối tượng bytes. (ví dụ: '12:23:34:45:56:67' hoặc b'12:23:34:45:56:67')

      Thay đổi trong phiên bản 3.14: Đã thêm hỗ trợ FreeBSD.

  • AF_ALG là giao diện dựa trên socket chỉ dành cho Linux cho mật mã hạt nhân. Một ổ cắm thuật toán được cấu hình với một bộ gồm hai đến bốn phần tử (type, name [, feat [, mask]]), trong đó:

    • type là loại thuật toán dưới dạng chuỗi, ví dụ: aead, hash, skcipher hoặc rng.

    • name là tên thuật toán và chế độ hoạt động dưới dạng chuỗi, ví dụ: sha256, hmac(sha256), cbc(aes) hoặc drbg_nopr_ctr_aes256.

    • featmask là số nguyên 32 bit không dấu.

    sẵn có: Linux >= 2.6.38.

    Một số loại thuật toán yêu cầu Kernel mới hơn.

    Added in version 3.6.

  • AF_VSOCK cho phép giao tiếp giữa các máy ảo và máy chủ của chúng. Các ổ cắm được biểu diễn dưới dạng bộ dữ liệu (CID, port) trong đó ID ngữ cảnh hoặc CID và cổng là số nguyên.

    sẵn có: Linux >= 3.9

    Xem vsock(7)

    Added in version 3.7.

  • AF_PACKET là giao diện cấp thấp trực tiếp với các thiết bị mạng. Các địa chỉ được biểu thị bằng bộ (ifname, proto[, pkttype[, hatype[, addr]]]) trong đó:

    • ifname - Chuỗi chỉ định tên thiết bị.

    • proto - Số giao thức Ethernet. Có thể là ETH_P_ALL để nắm bắt tất cả các giao thức, một trong các ETHERTYPE_* constants hoặc bất kỳ số giao thức Ethernet nào khác.

    • pkttype - Số nguyên tùy chọn chỉ định loại gói:

      • PACKET_HOST (mặc định) - Gói được gửi tới máy chủ cục bộ.

      • PACKET_BROADCAST - Gói quảng bá lớp vật lý.

      • PACKET_MULTICAST - Gói được gửi đến địa chỉ multicast lớp vật lý.

      • PACKET_OTHERHOST - Gói tin tới một số máy chủ khác đã bị trình điều khiển thiết bị bắt ở chế độ lăng nhăng.

      • PACKET_OUTGOING - Gói có nguồn gốc từ máy chủ cục bộ được lặp lại vào ổ cắm gói.

    • hatype - Số nguyên tùy chọn chỉ định loại địa chỉ phần cứng ARP.

    • addr - Đối tượng giống byte tùy chọn chỉ định địa chỉ vật lý phần cứng, việc diễn giải tùy thuộc vào thiết bị.

    sẵn có: Linux >= 2.2.

  • AF_QIPCRTR là giao diện dựa trên socket chỉ dành cho Linux để liên lạc với các dịch vụ chạy trên bộ đồng xử lý trong nền tảng Qualcomm. Họ địa chỉ được biểu diễn dưới dạng bộ dữ liệu (node, port) trong đó nodeport là các số nguyên không âm.

    sẵn có: Linux >= 4.7.

    Added in version 3.8.

  • IPPROTO_UDPLITE là một biến thể của UDP cho phép bạn chỉ định phần nào của gói được bao phủ bởi tổng kiểm tra. Nó bổ sung thêm hai tùy chọn ổ cắm mà bạn có thể thay đổi. self.setsockopt(IPPROTO_UDPLITE, UDPLITE_SEND_CSCOV, length) sẽ thay đổi phần nào của các gói gửi đi được kiểm tra tổng và self.setsockopt(IPPROTO_UDPLITE, UDPLITE_RECV_CSCOV, length) sẽ lọc ra các gói bao gồm quá ít dữ liệu của chúng. Trong cả hai trường hợp, length phải ở dạng range(8, 2**16, 8).

    Ổ cắm như vậy phải được xây dựng bằng socket(AF_INET, SOCK_DGRAM, IPPROTO_UDPLITE) cho IPv4 hoặc socket(AF_INET6, SOCK_DGRAM, IPPROTO_UDPLITE) cho IPv6.

    sẵn có: Linux >= 2.6.20, FreeBSD >= 10.1

    Added in version 3.9.

  • AF_HYPERV là giao diện dựa trên ổ cắm chỉ dành cho Windows để liên lạc với máy chủ và khách Hyper-V. Họ địa chỉ được biểu diễn dưới dạng bộ dữ liệu (vm_id, service_id) trong đó vm_idservice_id là các chuỗi UUID.

    vm_id là mã định danh máy ảo hoặc một tập hợp các giá trị VMID đã biết nếu mục tiêu không phải là một máy ảo cụ thể. Các hằng số VMID đã biết được xác định trên socket là:

    • HV_GUID_ZERO

    • HV_GUID_BROADCAST

    • HV_GUID_WILDCARD - Được sử dụng để tự liên kết và chấp nhận kết nối từ tất cả các phân vùng.

    • HV_GUID_CHILDREN - Được sử dụng để tự liên kết và chấp nhận kết nối từ các phân vùng con.

    • HV_GUID_LOOPBACK - Được sử dụng làm mục tiêu cho chính nó.

    • HV_GUID_PARENT - Khi được sử dụng làm liên kết chấp nhận kết nối từ phân vùng chính. Khi được sử dụng làm mục tiêu địa chỉ, nó sẽ kết nối với phân vùng chính.

    Zz000zz là mã định danh dịch vụ của dịch vụ đã đăng ký.

    Added in version 3.12.

Nếu bạn sử dụng tên máy chủ trong phần host của địa chỉ ổ cắm IPv4/v6, chương trình có thể hiển thị hành vi không xác định, vì Python sử dụng địa chỉ đầu tiên được trả về từ độ phân giải DNS. Địa chỉ ổ cắm sẽ được phân giải khác nhau thành địa chỉ IPv4/v6 thực tế, tùy thuộc vào kết quả từ độ phân giải DNS và/hoặc cấu hình máy chủ. Đối với hành vi xác định, hãy sử dụng địa chỉ số trong phần host.

Tất cả các lỗi đều đưa ra ngoại lệ. Có thể đưa ra các ngoại lệ thông thường đối với các loại đối số không hợp lệ và tình trạng hết bộ nhớ. Các lỗi liên quan đến ngữ nghĩa ổ cắm hoặc địa chỉ gây ra OSError hoặc một trong các lớp con của nó.

Chế độ không chặn được hỗ trợ thông qua setblocking(). Việc khái quát hóa điều này dựa trên thời gian chờ được hỗ trợ thông qua settimeout().

Nội dung mô-đun

Mô-đun socket xuất các phần tử sau.

Ngoại lệ

exception socket.error

Bí danh OSError không được dùng nữa.

Thay đổi trong phiên bản 3.3: Sau PEP 3151, lớp này được đặt bí danh là OSError.

exception socket.herror

Một lớp con của OSError, ngoại lệ này được đưa ra đối với các lỗi liên quan đến địa chỉ, tức là đối với các hàm sử dụng h_errno trong POSIX C API, bao gồm gethostbyname_ex()gethostbyaddr(). Giá trị đi kèm là một cặp (h_errno, string) biểu thị lỗi được trả về bởi lệnh gọi thư viện. h_errno là một giá trị số, trong khi string đại diện cho mô tả của h_errno, được trả về bởi hàm hstrerror() C.

Thay đổi trong phiên bản 3.3: Lớp này được tạo thành một lớp con của OSError.

exception socket.gaierror

Một lớp con của OSError, ngoại lệ này được getaddrinfo()getnameinfo() đưa ra đối với các lỗi liên quan đến địa chỉ. Giá trị đi kèm là một cặp (error, string) biểu thị lỗi được trả về bởi lệnh gọi thư viện. string đại diện cho mô tả của error, được trả về bởi hàm gai_strerror() C. Giá trị số error sẽ khớp với một trong các hằng số EAI_* được xác định trong mô-đun này.

Thay đổi trong phiên bản 3.3: Lớp này được tạo thành một lớp con của OSError.

exception socket.timeout

Bí danh TimeoutError không được dùng nữa.

Là một lớp con của OSError, ngoại lệ này xuất hiện khi xảy ra thời gian chờ trên ổ cắm đã bật thời gian chờ thông qua lệnh gọi trước tới settimeout() (hoặc ngầm thông qua setdefaulttimeout()). Giá trị đi kèm là một chuỗi có giá trị hiện tại luôn "hết thời gian".

Thay đổi trong phiên bản 3.3: Lớp này được tạo thành một lớp con của OSError.

Thay đổi trong phiên bản 3.10: Lớp này được đặt bí danh là TimeoutError.

Hằng số

Các hằng số AF_* và SOCK_* hiện là các bộ sưu tập AddressFamilySocketKind IntEnum.

Added in version 3.4.

socket.AF_UNIX
socket.AF_INET
socket.AF_INET6

Các hằng số này đại diện cho họ địa chỉ (và giao thức), được sử dụng cho đối số đầu tiên của socket(). Nếu hằng số AF_UNIX không được xác định thì giao thức này không được hỗ trợ. Nhiều hằng số có thể có sẵn tùy thuộc vào hệ thống.

socket.AF_UNSPEC

AF_UNSPEC có nghĩa là getaddrinfo() sẽ trả về địa chỉ ổ cắm cho bất kỳ họ địa chỉ nào (IPv4, IPv6 hoặc bất kỳ địa chỉ nào khác) có thể được sử dụng.

socket.SOCK_STREAM
socket.SOCK_DGRAM
socket.SOCK_RAW
socket.SOCK_RDM
socket.SOCK_SEQPACKET

Các hằng số này đại diện cho các loại ổ cắm, được sử dụng cho đối số thứ hai của socket(). Nhiều hằng số có thể có sẵn tùy thuộc vào hệ thống. (Nói chung chỉ có SOCK_STREAMSOCK_DGRAM là hữu ích.)

socket.SOCK_CLOEXEC
socket.SOCK_NONBLOCK

Hai hằng số này, nếu được xác định, có thể được kết hợp với các loại ổ cắm và cho phép bạn đặt một số cờ một cách nguyên tử (do đó tránh được các điều kiện chạy đua có thể xảy ra và nhu cầu thực hiện các cuộc gọi riêng biệt).

Xem thêm

Secure File Descriptor Handling để được giải thích kỹ lưỡng hơn.

sẵn có: Linux >= 2.6.27.

Added in version 3.2.

SO_*
socket.SOMAXCONN
MSG_*
SOL_*
SCM_*
IPPROTO_*
IPPORT_*
INADDR_*
IP_*
IPV6_*
EAI_*
AI_*
NI_*
TCP_*

Nhiều hằng số thuộc các dạng này, được ghi lại trong tài liệu Unix về ổ cắm và/hoặc giao thức IP, cũng được xác định trong mô-đun ổ cắm. Chúng thường được sử dụng trong các đối số của phương thức setsockopt()getsockopt() của các đối tượng socket. Trong hầu hết các trường hợp, chỉ những ký hiệu được xác định trong tệp tiêu đề Unix mới được xác định; đối với một số ký hiệu, giá trị mặc định được cung cấp.

Thay đổi trong phiên bản 3.6: SO_DOMAIN, SO_PROTOCOL, SO_PEERSEC, SO_PASSSEC, TCP_USER_TIMEOUT, TCP_CONGESTION đã được thêm vào.

Thay đổi trong phiên bản 3.6.5: Đã thêm hỗ trợ cho TCP_FASTOPEN, TCP_KEEPCNT trên nền tảng Windows nếu có.

Thay đổi trong phiên bản 3.7: TCP_NOTSENT_LOWAT đã được thêm vào.

Đã thêm hỗ trợ cho TCP_KEEPIDLE, TCP_KEEPINTVL trên nền tảng Windows nếu có.

Thay đổi trong phiên bản 3.10: IP_RECVTOS đã được thêm vào. Đã thêm TCP_KEEPALIVE. Trên MacOS, hằng số này có thể được sử dụng giống như cách sử dụng TCP_KEEPIDLE trên Linux.

Thay đổi trong phiên bản 3.11: Đã thêm TCP_CONNECTION_INFO. Trên MacOS, hằng số này có thể được sử dụng giống như cách sử dụng TCP_INFO trên Linux và BSD.

Thay đổi trong phiên bản 3.12: Đã thêm SO_RTABLESO_USER_COOKIE. Trên OpenBSD và FreeBSD tương ứng, các hằng số đó có thể được sử dụng giống như cách sử dụng SO_MARK trên Linux. Đồng thời bổ sung thêm các tùy chọn ổ cắm TCP bị thiếu từ Linux: TCP_MD5SIG, TCP_THIN_LINEAR_TIMEOUTS, TCP_THIN_DUPACK, TCP_REPAIR, TCP_REPAIR_QUEUE, TCP_QUEUE_SEQ, TCP_REPAIR_OPTIONS, TCP_TIMESTAMP, TCP_CC_INFO, TCP_SAVE_SYN, TCP_SAVED_SYN, TCP_REPAIR_WINDOW, TCP_FASTOPEN_CONNECT, TCP_ULP, TCP_MD5SIG_EXT, TCP_FASTOPEN_KEY, TCP_FASTOPEN_NO_COOKIE, TCP_ZEROCOPY_RECEIVE, TCP_INQ, TCP_TX_DELAY. Đã thêm IP_PKTINFO, IP_UNBLOCK_SOURCE, IP_BLOCK_SOURCE, IP_ADD_SOURCE_MEMBERSHIP, IP_DROP_SOURCE_MEMBERSHIP.

Thay đổi trong phiên bản 3.13: Đã thêm SO_BINDTOIFINDEX. Trên Linux, hằng số này có thể được sử dụng giống như cách sử dụng SO_BINDTODEVICE, nhưng với chỉ mục của giao diện mạng thay vì tên của nó.

Thay đổi trong phiên bản 3.14: Đã thêm IP_FREEBIND, IP_RECVERR, IPV6_RECVERR, IP_RECVTTLIP_RECVORIGDSTADDR bị thiếu trên Linux.

Thay đổi trong phiên bản 3.14: Đã thêm hỗ trợ cho TCP_QUICKACK trên nền tảng Windows khi có sẵn.

socket.AF_CAN
socket.PF_CAN
SOL_CAN_*
CAN_*

Nhiều hằng số thuộc các dạng này, được ghi lại trong tài liệu Linux, cũng được xác định trong mô-đun ổ cắm.

sẵn có: Linux >= 2.6.25, NetBSD >= 8.

Added in version 3.3.

Thay đổi trong phiên bản 3.11: Hỗ trợ NetBSD đã được thêm vào.

Thay đổi trong phiên bản 3.14: Đã khôi phục CAN_RAW_ERR_FILTER bị thiếu trên Linux.

socket.CAN_BCM
CAN_BCM_*

CAN_BCM, thuộc họ giao thức CAN, là giao thức quản lý phát sóng (BCM). Các hằng số của trình quản lý quảng bá, được ghi lại trong tài liệu Linux, cũng được xác định trong mô-đun ổ cắm.

sẵn có: Linux >= 2.6.25.

Ghi chú

Cờ CAN_BCM_CAN_FD_FRAME chỉ có trên Linux >= 4.8.

Added in version 3.4.

socket.CAN_RAW_FD_FRAMES

Cho phép hỗ trợ CAN FD trong ổ cắm CAN_RAW. Điều này bị tắt theo mặc định. Điều này cho phép ứng dụng của bạn gửi cả khung FD CAN và CAN; tuy nhiên, bạn phải chấp nhận cả khung FD CAN và CAN khi đọc từ ổ cắm.

Hằng số này được ghi lại trong tài liệu Linux.

sẵn có: Linux >= 3.6.

Added in version 3.5.

socket.CAN_RAW_JOIN_FILTERS

Tham gia các bộ lọc CAN được áp dụng sao cho chỉ các khung CAN khớp với tất cả các bộ lọc CAN nhất định mới được chuyển vào không gian người dùng.

Hằng số này được ghi lại trong tài liệu Linux.

sẵn có: Linux >= 4.1.

Added in version 3.9.

socket.CAN_ISOTP

CAN_ISOTP, thuộc họ giao thức CAN, là giao thức ISO-TP (ISO 15765-2). Các hằng số ISO-TP, được ghi lại trong tài liệu Linux.

sẵn có: Linux >= 2.6.25.

Added in version 3.7.

socket.CAN_J1939

CAN_J1939, thuộc họ giao thức CAN, là giao thức SAE J1939. Các hằng số J1939, được ghi lại trong tài liệu Linux.

sẵn có: Linux >= 5.4.

Added in version 3.9.

socket.AF_DIVERT
socket.PF_DIVERT

Hai hằng số này, được ghi lại trong trang hướng dẫn sử dụng FreeBSD redirect(4), cũng được xác định trong mô-đun ổ cắm.

sẵn có: FreeBSD >= 14.0.

Added in version 3.12.

socket.AF_PACKET
socket.PF_PACKET
PACKET_*

Nhiều hằng số thuộc các dạng này, được ghi lại trong tài liệu Linux, cũng được xác định trong mô-đun ổ cắm.

sẵn có: Linux >= 2.2.

socket.ETH_P_ALL

ETH_P_ALL có thể được sử dụng trong hàm tạo socket dưới dạng proto cho họ AF_PACKET để nắm bắt mọi gói tin, bất kể giao thức.

Để biết thêm thông tin, hãy xem trang chủ packet(7).

sẵn có: Linux.

Added in version 3.12.

socket.AF_RDS
socket.PF_RDS
socket.SOL_RDS
RDS_*

Nhiều hằng số thuộc các dạng này, được ghi lại trong tài liệu Linux, cũng được xác định trong mô-đun ổ cắm.

sẵn có: Linux >= 2.6.30.

Added in version 3.3.

socket.SIO_RCVALL
socket.SIO_KEEPALIVE_VALS
socket.SIO_LOOPBACK_FAST_PATH
RCVALL_*

Các hằng số cho WSAIoctl() của Windows. Các hằng số được sử dụng làm đối số cho phương thức ioctl() của các đối tượng socket.

Thay đổi trong phiên bản 3.6: SIO_LOOPBACK_FAST_PATH đã được thêm vào.

TIPC_*

các hằng số liên quan đến TIPC, khớp với các hằng số được xuất bởi ổ cắm C API. Xem tài liệu TIPC để biết thêm thông tin.

socket.AF_ALG
socket.SOL_ALG
ALG_*

Các hằng số cho mật mã hạt nhân Linux.

sẵn có: Linux >= 2.6.38.

Added in version 3.6.

socket.AF_VSOCK
socket.IOCTL_VM_SOCKETS_GET_LOCAL_CID
VMADDR*
SO_VM*

Các hằng số cho giao tiếp máy chủ/khách Linux.

sẵn có: Linux >= 4.8.

Added in version 3.7.

sẵn có: BSD, macOS.

Added in version 3.4.

socket.has_ipv6

Hằng số này chứa giá trị boolean cho biết liệu IPv6 có được hỗ trợ trên nền tảng này hay không.

socket.AF_BLUETOOTH
socket.BTPROTO_L2CAP
socket.BTPROTO_RFCOMM
socket.BTPROTO_HCI
socket.BTPROTO_SCO

Hằng số nguyên để sử dụng với địa chỉ Bluetooth.

socket.BDADDR_ANY
socket.BDADDR_LOCAL

Đây là các hằng chuỗi chứa địa chỉ Bluetooth có ý nghĩa đặc biệt. Ví dụ: BDADDR_ANY có thể được sử dụng để chỉ ra bất kỳ địa chỉ nào khi chỉ định ổ cắm liên kết bằng BTPROTO_RFCOMM.

socket.BDADDR_BREDR
socket.BDADDR_LE_PUBLIC
socket.BDADDR_LE_RANDOM

Các hằng số này mô tả loại địa chỉ Bluetooth khi liên kết hoặc kết nối ổ cắm BTPROTO_L2CAP.

sẵn có: Linux, FreeBSD

Added in version 3.14.

socket.SOL_RFCOMM
socket.SOL_L2CAP
socket.SOL_HCI
socket.SOL_SCO
socket.SOL_BLUETOOTH

Được sử dụng trong đối số cấp độ cho các phương thức setsockopt()getsockopt() của các đối tượng ổ cắm Bluetooth.

SOL_BLUETOOTH chỉ có trên Linux. Các hằng số khác có sẵn nếu giao thức tương ứng được hỗ trợ.

SO_L2CAP_*
socket.L2CAP_LM
L2CAP_LM_*
SO_RFCOMM_*
RFCOMM_LM_*
SO_SCO_*
SO_BTH_*
BT_*

Được sử dụng trong đối số giá trị và tên tùy chọn cho các phương thức setsockopt()getsockopt() của các đối tượng ổ cắm Bluetooth.

BT_*L2CAP_LM chỉ có trên Linux. SO_BTH_* chỉ có trên Windows. Các hằng số khác có thể có sẵn trên Linux và các nền tảng BSD khác nhau.

Added in version 3.14.

socket.HCI_FILTER
socket.HCI_TIME_STAMP
socket.HCI_DATA_DIR
socket.SO_HCI_EVT_FILTER
socket.SO_HCI_PKT_FILTER

Tên tùy chọn để sử dụng với BTPROTO_HCI. Tính khả dụng và định dạng của các giá trị tùy chọn tùy thuộc vào nền tảng.

Thay đổi trong phiên bản 3.14: Đã thêm SO_HCI_EVT_FILTERSO_HCI_PKT_FILTER trên NetBSD và DragonFly BSD. Đã thêm HCI_DATA_DIR trên FreeBSD, NetBSD và DragonFly BSD.

socket.HCI_DEV_NONE

Giá trị device_id được sử dụng để tạo ổ cắm HCI không dành riêng cho một bộ điều hợp Bluetooth nào.

sẵn có: Linux

Added in version 3.14.

socket.HCI_CHANNEL_RAW
socket.HCI_CHANNEL_USER
socket.HCI_CHANNEL_MONITOR
socket.HCI_CHANNEL_CONTROL
socket.HCI_CHANNEL_LOGGING

Các giá trị có thể có cho trường channel trong địa chỉ BTPROTO_HCI.

sẵn có: Linux

Added in version 3.14.

socket.AF_QIPCRTR

Không đổi cho giao thức bộ định tuyến IPC của Qualcomm, được sử dụng để liên lạc với dịch vụ cung cấp bộ xử lý từ xa.

sẵn có: Linux >= 4.7.

socket.SCM_CREDS2
socket.LOCAL_CREDS
socket.LOCAL_CREDS_PERSISTENT

LOCAL_CREDS và LOCAL_CREDS_PERSISTENT có thể được sử dụng với các ổ cắm SOCK_DGRAM, SOCK_STREAM, tương đương với Linux/DragonFlyBSD SO_PASSCRED, trong khi LOCAL_CREDS gửi thông tin đăng nhập ở lần đọc đầu tiên, LOCAL_CREDS_PERSISTENT gửi cho mỗi lần đọc, sau đó, SCM_CREDS2 phải được sử dụng cho lần đọc sau đối với loại thông báo.

Added in version 3.11.

sẵn có: FreeBSD.

socket.SO_INCOMING_CPU

Hằng số để tối ưu hóa vị trí CPU, được sử dụng cùng với SO_REUSEPORT.

Added in version 3.11.

sẵn có: Linux >= 3.9

socket.SO_REUSEPORT_LB

Hằng số để cho phép liên kết địa chỉ và cổng trùng lặp với cân bằng tải.

Added in version 3.14.

sẵn có: FreeBSD >= 12.0

socket.AF_HYPERV
socket.HV_PROTOCOL_RAW
socket.HVSOCKET_CONNECT_TIMEOUT
socket.HVSOCKET_CONNECT_TIMEOUT_MAX
socket.HVSOCKET_CONNECTED_SUSPEND
socket.HVSOCKET_ADDRESS_FLAG_PASSTHRU
socket.HV_GUID_ZERO
socket.HV_GUID_WILDCARD
socket.HV_GUID_BROADCAST
socket.HV_GUID_CHILDREN
socket.HV_GUID_LOOPBACK
socket.HV_GUID_PARENT

Các hằng số dành cho ổ cắm Windows Hyper-V để liên lạc với máy chủ/khách.

sẵn có: Windows.

Added in version 3.12.

socket.ETHERTYPE_ARP
socket.ETHERTYPE_IP
socket.ETHERTYPE_IPV6
socket.ETHERTYPE_VLAN

IEEE 802.3 protocol number. hằng số.

sẵn có: Linux, FreeBSD, macOS.

Added in version 3.12.

socket.SHUT_RD
socket.SHUT_WR
socket.SHUT_RDWR

Các hằng số này được sử dụng bởi phương thức shutdown() của các đối tượng socket.

sẵn có: not WASI.

Chức năng

Tạo ổ cắm

Các hàm sau đều tạo socket objects.

class socket.socket(family=AF_INET, type=SOCK_STREAM, proto=0, fileno=None)

Tạo một ổ cắm mới bằng cách sử dụng họ địa chỉ, loại ổ cắm và số giao thức đã cho. Họ địa chỉ phải là AF_INET (mặc định), AF_INET6, AF_UNIX, AF_CAN, AF_PACKET hoặc AF_RDS. Loại ổ cắm phải là SOCK_STREAM (mặc định), SOCK_DGRAM, SOCK_RAW hoặc có lẽ là một trong các hằng số SOCK_ khác. Số giao thức thường bằng 0 và có thể bị bỏ qua hoặc trong trường hợp họ địa chỉ là AF_CAN thì giao thức phải là một trong các CAN_RAW, CAN_BCM, CAN_ISOTP hoặc CAN_J1939.

Nếu fileno được chỉ định, các giá trị cho family, typeproto sẽ được tự động phát hiện từ bộ mô tả tệp được chỉ định. Tính năng tự động phát hiện có thể được loại bỏ bằng cách gọi hàm với các đối số family, type hoặc proto rõ ràng. Điều này chỉ ảnh hưởng đến cách Python thể hiện, ví dụ: giá trị trả về của socket.getpeername() nhưng không phải là tài nguyên hệ điều hành thực tế. Không giống như socket.fromfd(), fileno sẽ trả về cùng một ổ cắm và không trùng lặp. Điều này có thể giúp đóng ổ cắm tách rời bằng socket.close().

Ổ cắm mới được tạo là non-inheritable.

Tăng một auditing event socket.__new__ với các đối số self, family, type, protocol.

Thay đổi trong phiên bản 3.3: Gia đình AF_CAN đã được thêm vào. Gia đình AF_RDS đã được thêm vào.

Thay đổi trong phiên bản 3.4: Giao thức CAN_BCM đã được thêm vào.

Thay đổi trong phiên bản 3.4: Ổ cắm được trả về hiện không thể kế thừa được.

Thay đổi trong phiên bản 3.7: Giao thức CAN_ISOTP đã được thêm vào.

Thay đổi trong phiên bản 3.7: Khi cờ bit SOCK_NONBLOCK hoặc SOCK_CLOEXEC được áp dụng cho type, chúng sẽ bị xóa và socket.type sẽ không phản ánh chúng. Chúng vẫn được chuyển đến lệnh gọi socket() của hệ thống cơ bản. Vì vậy,

sock = socket.socket(
     cắm.AF_INET,
    socket.SOCK_STREAM | socket.SOCK_NONBLOCK)

vẫn sẽ tạo một ổ cắm không chặn trên các hệ điều hành hỗ trợ SOCK_NONBLOCK, nhưng sock.type sẽ được đặt thành socket.SOCK_STREAM.

Thay đổi trong phiên bản 3.9: Giao thức CAN_J1939 đã được thêm vào.

Thay đổi trong phiên bản 3.10: Giao thức IPPROTO_MPTCP đã được thêm vào.

socket.socketpair([family[, type[, proto]]])

Xây dựng một cặp đối tượng ổ cắm được kết nối bằng cách sử dụng họ địa chỉ, loại ổ cắm và số giao thức đã cho. Họ địa chỉ, loại ổ cắm và số giao thức giống như đối với hàm socket(). Họ mặc định là AF_UNIX nếu được xác định trên nền tảng; nếu không thì mặc định là AF_INET.

Các ổ cắm mới được tạo là non-inheritable.

Thay đổi trong phiên bản 3.2: Các đối tượng ổ cắm được trả về hiện hỗ trợ toàn bộ ổ cắm API, thay vì một tập hợp con.

Thay đổi trong phiên bản 3.4: Các ổ cắm được trả về hiện không thể kế thừa được.

Thay đổi trong phiên bản 3.5: Đã thêm hỗ trợ Windows.

socket.create_connection(address, timeout=GLOBAL_DEFAULT, source_address=None, *, all_errors=False)

Kết nối với dịch vụ TCP nghe trên internet address ((host, port) 2 bộ) và trả về đối tượng socket. Đây là một hàm cấp cao hơn socket.connect(): nếu host là tên máy chủ không phải số, nó sẽ cố gắng phân giải tên máy chủ đó cho cả AF_INETAF_INET6, sau đó thử kết nối lần lượt với tất cả các địa chỉ có thể cho đến khi kết nối thành công. Điều này giúp dễ dàng viết các ứng dụng khách tương thích với cả IPv4 và IPv6.

Việc truyền tham số timeout tùy chọn sẽ đặt thời gian chờ trên phiên bản ổ cắm trước khi thử kết nối. Nếu không cung cấp timeout thì cài đặt thời gian chờ mặc định chung được getdefaulttimeout() trả về sẽ được sử dụng.

Nếu được cung cấp, source_address phải là (host, port) gồm 2 bộ để ổ cắm liên kết làm địa chỉ nguồn trước khi kết nối. Nếu máy chủ hoặc cổng tương ứng là '' hoặc 0 thì hành vi mặc định của hệ điều hành sẽ được sử dụng.

Khi không thể tạo kết nối, một ngoại lệ sẽ xuất hiện. Theo mặc định, đây là ngoại lệ đối với địa chỉ cuối cùng trong danh sách. Nếu all_errorsTrue thì đó là ExceptionGroup chứa lỗi trong tất cả các lần thử.

Thay đổi trong phiên bản 3.2: source_address đã được thêm vào.

Thay đổi trong phiên bản 3.11: all_errors đã được thêm vào.

socket.create_server(address, *, family=AF_INET, backlog=None, reuse_port=False, dualstack_ipv6=False)

Hàm tiện lợi tạo ra một ổ cắm TCP được liên kết với address (một (host, port) 2 bộ) và trả về đối tượng ổ cắm.

family phải là AF_INET hoặc AF_INET6. backlog là kích thước hàng đợi được chuyển tới socket.listen(); nếu không được chỉ định, giá trị hợp lý mặc định sẽ được chọn. reuse_port quyết định có đặt tùy chọn ổ cắm SO_REUSEPORT hay không.

Nếu dualstack_ipv6 là đúng thì familyAF_INET6 và nền tảng hỗ trợ nó, ổ cắm sẽ có thể chấp nhận cả kết nối IPv4 và IPv6, nếu không, nó sẽ tăng ValueError. Hầu hết các nền tảng POSIX và Windows đều hỗ trợ chức năng này. Khi chức năng này được bật, địa chỉ được socket.getpeername() trả về khi kết nối IPv4 xảy ra sẽ là địa chỉ IPv6 được biểu thị dưới dạng địa chỉ IPv6 được ánh xạ IPv4. Nếu dualstack_ipv6 sai, nó sẽ tắt chức năng này một cách rõ ràng trên các nền tảng kích hoạt chức năng này theo mặc định (ví dụ: Linux). Tham số này có thể được sử dụng cùng với has_dualstack_ipv6():

 cắm nhập khẩu

giao diện addr = ("", 8080) # all, cổng 8080
nếu socket.has_dualstack_ipv6():
    s = socket.create_server(addr, family=socket.AF_INET6, Dualstack_ipv6=True)
khác:
    s = socket.create_server(addr)

Ghi chú

Trên nền tảng POSIX, tùy chọn ổ cắm SO_REUSEADDR được đặt để ngay lập tức sử dụng lại các ổ cắm trước đó được liên kết trên cùng một address và vẫn ở trạng thái TIME_WAIT.

Added in version 3.8.

socket.has_dualstack_ipv6()

Trả về True nếu nền tảng hỗ trợ tạo ổ cắm TCP có thể xử lý cả kết nối IPv4 và IPv6.

Added in version 3.8.

socket.fromfd(fd, family, type, proto=0)

Sao chép bộ mô tả tệp fd (một số nguyên được trả về bởi phương thức fileno() của đối tượng tệp) và xây dựng một đối tượng socket từ kết quả. Họ địa chỉ, loại ổ cắm và số giao thức giống như đối với hàm socket(). Bộ mô tả tệp phải tham chiếu đến một ổ cắm, nhưng điều này không được kiểm tra --- các thao tác tiếp theo trên đối tượng có thể thất bại nếu bộ mô tả tệp không hợp lệ. Chức năng này hiếm khi cần thiết, nhưng có thể được sử dụng để lấy hoặc đặt các tùy chọn ổ cắm trên ổ cắm được truyền tới chương trình dưới dạng đầu vào hoặc đầu ra tiêu chuẩn (chẳng hạn như máy chủ được khởi động bởi daemon Unix inet). Ổ cắm được coi là ở chế độ chặn.

Ổ cắm mới được tạo là non-inheritable.

Thay đổi trong phiên bản 3.4: Ổ cắm được trả về hiện không thể kế thừa được.

socket.fromshare(data)

Khởi tạo ổ cắm từ dữ liệu thu được từ phương thức socket.share(). Ổ cắm được coi là ở chế độ chặn.

sẵn có: Windows.

Added in version 3.3.

socket.SocketType

Đây là một đối tượng kiểu Python đại diện cho kiểu đối tượng socket. Nó giống như type(socket(...)).

Các chức năng khác

Mô-đun socket cũng cung cấp nhiều dịch vụ liên quan đến mạng:

socket.close(fd)

Đóng bộ mô tả tệp ổ cắm. Điều này giống như os.close(), nhưng dành cho socket. Trên một số nền tảng (đáng chú ý nhất là Windows) os.close() không hoạt động đối với các bộ mô tả tệp ổ cắm.

Added in version 3.7.

socket.getaddrinfo(host, port, family=AF_UNSPEC, type=0, proto=0, flags=0)

Hàm này bao bọc hàm C getaddrinfo của hệ thống cơ bản.

Dịch đối số host/port thành một chuỗi gồm 5 bộ chứa tất cả các đối số cần thiết để tạo ổ cắm được kết nối với dịch vụ đó. host là một tên miền, một chuỗi biểu thị địa chỉ IPv4/v6 hoặc None. port là tên dịch vụ chuỗi chẳng hạn như 'http', số cổng số hoặc None. Bằng cách chuyển None làm giá trị của hostport, bạn có thể chuyển NULL cho C API cơ bản.

Các đối số family, typeproto có thể được chỉ định tùy ý để cung cấp các tùy chọn và giới hạn danh sách địa chỉ được trả về. Chuyển các giá trị mặc định của chúng (lần lượt là AF_UNSPEC, 0 và 0) để không giới hạn kết quả. Xem ghi chú bên dưới để biết chi tiết.

Đối số flags có thể là một hoặc một số hằng số AI_* và sẽ ảnh hưởng đến cách tính toán và trả về kết quả. Ví dụ: AI_NUMERICHOST sẽ vô hiệu hóa độ phân giải tên miền và sẽ báo lỗi nếu host là tên miền.

Hàm trả về danh sách 5 bộ dữ liệu có cấu trúc sau:

(family, type, proto, canonname, sockaddr)

Trong các bộ dữ liệu này, family, type, proto đều là số nguyên và được truyền cho hàm socket(). canonname sẽ là một chuỗi đại diện cho tên chuẩn của host nếu AI_CANONNAME là một phần của đối số flags; nếu không canonname sẽ trống. sockaddr là một bộ dữ liệu mô tả một địa chỉ ổ cắm, có định dạng phụ thuộc vào family được trả về (một bộ 2 (address, port) cho AF_INET, một bộ 4 bộ (address, port, flowinfo, scope_id) cho AF_INET6) và được chuyển cho phương thức socket.connect().

Ghi chú

Nếu bạn dự định sử dụng kết quả từ getaddrinfo() để tạo một ổ cắm (thay vì truy xuất canonname chẳng hạn), hãy xem xét giới hạn kết quả theo type (ví dụ: SOCK_STREAM hoặc SOCK_DGRAM) và/hoặc proto (ví dụ: IPPROTO_TCP hoặc IPPROTO_UDP) mà ứng dụng của bạn có thể xử lý.

Hành vi với các giá trị mặc định là family, type, protoflags là tùy theo hệ thống.

Nhiều hệ thống (ví dụ: hầu hết các cấu hình Linux) sẽ trả về một danh sách được sắp xếp gồm tất cả các địa chỉ trùng khớp. Các địa chỉ này thường phải được thử theo thứ tự cho đến khi kết nối thành công (có thể thử song song, chẳng hạn như sử dụng thuật toán Happy Eyeballs). Trong những trường hợp này, việc giới hạn type và/hoặc proto có thể giúp loại bỏ các nỗ lực kết nối không thành công hoặc không sử dụng được.

Tuy nhiên, một số hệ thống sẽ chỉ trả về một địa chỉ duy nhất. (Ví dụ: điều này đã được báo cáo trên cấu hình Solaris và AIX.) Trên các hệ thống này, việc giới hạn type và/hoặc proto giúp đảm bảo rằng địa chỉ này có thể sử dụng được.

Tăng một auditing event socket.getaddrinfo với các đối số host, port, family, type, protocol.

Ví dụ sau tìm nạp thông tin địa chỉ cho kết nối TCP giả định tới example.org trên cổng 80 (kết quả có thể khác trên hệ thống của bạn nếu IPv6 không được bật):

>>> socket.getaddrinfo("example.org", 80, proto=socket.IPPROTO_TCP)
[(socket.AF_INET6, socket.SOCK_STREAM,
 6, '', ('2606:2800:220:1:248:1893:25c8:1946', 80, 0, 0)),
 (socket.AF_INET, socket.SOCK_STREAM,
 6, '', ('93.184.216.34', 80))]

Thay đổi trong phiên bản 3.2: bây giờ các tham số có thể được truyền bằng cách sử dụng đối số từ khóa.

Thay đổi trong phiên bản 3.7: đối với địa chỉ multicast IPv6, chuỗi đại diện cho một địa chỉ sẽ không chứa phần %scope_id.

socket.getfqdn([name])

Trả lại tên miền đủ điều kiện cho name. Nếu name bị bỏ qua hoặc trống, nó được hiểu là máy chủ cục bộ. Để tìm tên đủ điều kiện, tên máy chủ được trả về bởi gethostbyaddr() sẽ được kiểm tra, theo sau là bí danh của máy chủ, nếu có. Tên đầu tiên bao gồm dấu chấm được chọn. Trong trường hợp không có tên miền đủ điều kiện và name được cung cấp, nó sẽ được trả về không thay đổi. Nếu name trống hoặc bằng '0.0.0.0', tên máy chủ từ gethostname() sẽ được trả về.

socket.gethostbyname(hostname)

Dịch tên máy chủ sang định dạng địa chỉ IPv4. Địa chỉ IPv4 được trả về dưới dạng chuỗi, chẳng hạn như '100.50.200.5'. Nếu tên máy chủ là một địa chỉ IPv4 thì nó sẽ được trả về không thay đổi. Xem gethostbyname_ex() để có giao diện hoàn thiện hơn. gethostbyname() không hỗ trợ độ phân giải tên IPv6 và thay vào đó, getaddrinfo() nên được sử dụng để hỗ trợ ngăn xếp kép IPv4/v6.

Tăng một auditing event socket.gethostbyname với đối số hostname.

sẵn có: not WASI.

socket.gethostbyname_ex(hostname)

Dịch tên máy chủ sang định dạng địa chỉ IPv4, giao diện mở rộng. Trả về (hostname, aliaslist, ipaddrlist) gồm 3 bộ, trong đó hostname là tên máy chủ chính của máy chủ, aliaslist là danh sách (có thể trống) gồm các tên máy chủ thay thế cho cùng một địa chỉ và ipaddrlist là danh sách các địa chỉ IPv4 cho cùng một giao diện trên cùng một máy chủ (thường nhưng không phải lúc nào cũng là một địa chỉ duy nhất). gethostbyname_ex() không hỗ trợ độ phân giải tên IPv6 và thay vào đó, getaddrinfo() nên được sử dụng để hỗ trợ ngăn xếp kép IPv4/v6.

Tăng một auditing event socket.gethostbyname với đối số hostname.

sẵn có: not WASI.

socket.gethostname()

Trả về một chuỗi chứa tên máy chủ của máy nơi trình thông dịch Python hiện đang thực thi.

Tăng auditing event socket.gethostname mà không có đối số.

Lưu ý: gethostname() không phải lúc nào cũng trả về tên miền đủ điều kiện; sử dụng getfqdn() cho việc đó.

sẵn có: not WASI.

socket.gethostbyaddr(ip_address)

Trả về (hostname, aliaslist, ipaddrlist) gồm 3 bộ, trong đó hostname là tên máy chủ chính phản hồi ip_address đã cho, aliaslist là danh sách (có thể trống) gồm các tên máy chủ thay thế cho cùng một địa chỉ và ipaddrlist là danh sách các địa chỉ IPv4/v6 cho cùng một giao diện trên cùng một máy chủ (rất có thể chỉ chứa một địa chỉ duy nhất). Để tìm tên miền đủ điều kiện, hãy sử dụng hàm getfqdn(). gethostbyaddr() hỗ trợ cả IPv4 và IPv6.

Tăng một auditing event socket.gethostbyaddr với đối số ip_address.

sẵn có: not WASI.

socket.getnameinfo(sockaddr, flags)

Dịch địa chỉ socket sockaddr thành (host, port) gồm 2 bộ. Tùy thuộc vào cài đặt của flags, kết quả có thể chứa tên miền hoặc địa chỉ số đủ điều kiện trong host. Tương tự, port có thể chứa tên cổng chuỗi hoặc số cổng số.

Đối với địa chỉ IPv6, %scope_id được thêm vào phần máy chủ nếu sockaddr chứa scope_id có ý nghĩa. Thông thường điều này xảy ra đối với các địa chỉ multicast.

Để biết thêm thông tin về flags bạn có thể tham khảo getnameinfo(3).

Tăng một auditing event socket.getnameinfo với đối số sockaddr.

sẵn có: not WASI.

socket.getprotobyname(protocolname)

Dịch tên giao thức internet (ví dụ: 'icmp') thành một hằng số phù hợp để chuyển làm đối số thứ ba (tùy chọn) cho hàm socket(). Điều này thường chỉ cần thiết cho các ổ cắm được mở ở chế độ "thô" (SOCK_RAW); đối với các chế độ ổ cắm thông thường, giao thức chính xác sẽ được chọn tự động nếu giao thức bị bỏ qua hoặc bằng 0.

sẵn có: not WASI.

socket.getservbyname(servicename[, protocolname])

Dịch tên dịch vụ internet và tên giao thức sang số cổng cho dịch vụ đó. Tên giao thức tùy chọn, nếu được cung cấp, phải là 'tcp' hoặc 'udp', nếu không mọi giao thức sẽ khớp.

Tăng một auditing event socket.getservbyname với các đối số servicename, protocolname.

sẵn có: not WASI.

socket.getservbyport(port[, protocolname])

Dịch số cổng internet và tên giao thức thành tên dịch vụ cho dịch vụ đó. Tên giao thức tùy chọn, nếu được cung cấp, phải là 'tcp' hoặc 'udp', nếu không mọi giao thức sẽ khớp.

Tăng một auditing event socket.getservbyport với các đối số port, protocolname.

sẵn có: not WASI.

socket.ntohl(x)

Chuyển đổi số nguyên dương 32 bit từ mạng sang thứ tự byte máy chủ. Trên các máy có thứ tự byte máy chủ giống với thứ tự byte mạng, đây là trường hợp không hoạt động; mặt khác, nó thực hiện thao tác hoán đổi 4 byte.

socket.ntohs(x)

Chuyển đổi số nguyên dương 16 bit từ mạng sang thứ tự byte máy chủ. Trên các máy có thứ tự byte máy chủ giống với thứ tự byte mạng, đây là trường hợp không hoạt động; mặt khác, nó thực hiện thao tác hoán đổi 2 byte.

Thay đổi trong phiên bản 3.10: Tăng OverflowError nếu x không vừa với số nguyên không dấu 16 bit.

socket.htonl(x)

Chuyển đổi số nguyên dương 32 bit từ máy chủ sang thứ tự byte mạng. Trên các máy có thứ tự byte máy chủ giống với thứ tự byte mạng, đây là trường hợp không hoạt động; mặt khác, nó thực hiện thao tác hoán đổi 4 byte.

socket.htons(x)

Chuyển đổi số nguyên dương 16 bit từ máy chủ sang thứ tự byte mạng. Trên các máy có thứ tự byte máy chủ giống với thứ tự byte mạng, đây là trường hợp không hoạt động; mặt khác, nó thực hiện thao tác hoán đổi 2 byte.

Thay đổi trong phiên bản 3.10: Tăng OverflowError nếu x không vừa với số nguyên không dấu 16 bit.

socket.inet_aton(ip_string)

Chuyển đổi địa chỉ IPv4 từ định dạng chuỗi bốn chấm (ví dụ: '123,45,67,89') sang định dạng nhị phân đóng gói 32 bit, dưới dạng đối tượng byte có độ dài bốn ký tự. Điều này hữu ích khi trò chuyện với một chương trình sử dụng thư viện C tiêu chuẩn và cần các đối tượng thuộc loại in_addr, là loại C cho mã nhị phân được đóng gói 32 bit mà hàm này trả về.

inet_aton() cũng chấp nhận các chuỗi có ít hơn ba dấu chấm; xem trang hướng dẫn sử dụng Unix inet(3) để biết chi tiết.

Nếu chuỗi địa chỉ IPv4 được truyền cho chức năng này không hợp lệ, OSError sẽ được nâng lên. Lưu ý rằng chính xác những gì hợp lệ phụ thuộc vào việc triển khai C cơ bản của inet_aton().

inet_aton() không hỗ trợ IPv6 và thay vào đó, inet_pton() nên được sử dụng để hỗ trợ ngăn xếp kép IPv4/v6.

socket.inet_ntoa(packed_ip)

Chuyển đổi địa chỉ IPv4 được đóng gói 32 bit (bytes-like object có chiều dài bốn byte) thành biểu diễn chuỗi chấm tứ giác tiêu chuẩn (ví dụ: '123.45.67.89'). Điều này hữu ích khi trò chuyện với một chương trình sử dụng thư viện C tiêu chuẩn và cần các đối tượng thuộc loại in_addr, là loại C cho dữ liệu nhị phân được đóng gói 32 bit mà hàm này lấy làm đối số.

Nếu chuỗi byte được truyền cho hàm này không dài chính xác 4 byte, OSError sẽ được tăng lên. inet_ntoa() không hỗ trợ IPv6 và thay vào đó, inet_ntop() nên được sử dụng để hỗ trợ ngăn xếp kép IPv4/v6.

Thay đổi trong phiên bản 3.5: bytes-like object có thể ghi hiện đã được chấp nhận.

socket.inet_pton(address_family, ip_string)

Chuyển đổi địa chỉ IP từ định dạng chuỗi dành riêng cho họ sang định dạng nhị phân, đóng gói. inet_pton() rất hữu ích khi thư viện hoặc giao thức mạng gọi đối tượng thuộc loại in_addr (tương tự inet_aton()) hoặc in6_addr.

Các giá trị được hỗ trợ cho address_family hiện là AF_INETAF_INET6. Nếu chuỗi địa chỉ IP ip_string không hợp lệ, OSError sẽ được nâng lên. Lưu ý rằng chính xác những gì hợp lệ phụ thuộc vào cả giá trị của address_family và cách triển khai cơ bản của inet_pton().

sẵn có: Unix, Windows.

Thay đổi trong phiên bản 3.4: Đã thêm hỗ trợ Windows

socket.inet_ntop(address_family, packed_ip)

Chuyển đổi địa chỉ IP được đóng gói (bytes-like object có số byte) thành biểu diễn chuỗi tiêu chuẩn, dành riêng cho họ (ví dụ: '7.10.0.5' hoặc '5aef:2b::8'). inet_ntop() rất hữu ích khi thư viện hoặc giao thức mạng trả về một đối tượng thuộc loại in_addr (tương tự inet_ntoa()) hoặc in6_addr.

Các giá trị được hỗ trợ cho address_family hiện là AF_INETAF_INET6. Nếu đối tượng byte packed_ip không có độ dài chính xác cho họ địa chỉ đã chỉ định, ValueError sẽ được nâng lên. OSError được đưa ra do lỗi khi gọi tới inet_ntop().

sẵn có: Unix, Windows.

Thay đổi trong phiên bản 3.4: Đã thêm hỗ trợ Windows

Thay đổi trong phiên bản 3.5: bytes-like object có thể ghi hiện đã được chấp nhận.

socket.CMSG_LEN(length)

Trả về tổng chiều dài, không có phần đệm ở cuối, của một mục dữ liệu phụ trợ với dữ liệu liên quan của length đã cho. Giá trị này thường có thể được sử dụng làm kích thước bộ đệm để recvmsg() nhận một mục dữ liệu phụ trợ, nhưng RFC 3542 yêu cầu các ứng dụng di động sử dụng CMSG_SPACE() và do đó bao gồm không gian cho phần đệm, ngay cả khi mục đó sẽ là mục cuối cùng trong bộ đệm. Tăng OverflowError nếu length nằm ngoài phạm vi giá trị cho phép.

sẵn có: Unix, not WASI.

Hầu hết các nền tảng Unix.

Added in version 3.3.

socket.CMSG_SPACE(length)

Trả về kích thước bộ đệm cần thiết cho recvmsg() để nhận mục dữ liệu phụ trợ với dữ liệu liên quan của length đã cho, cùng với bất kỳ phần đệm cuối nào. Dung lượng bộ đệm cần thiết để nhận nhiều mục là tổng các giá trị CMSG_SPACE() cho độ dài dữ liệu liên quan của chúng. Tăng OverflowError nếu length nằm ngoài phạm vi giá trị cho phép.

Lưu ý rằng một số hệ thống có thể hỗ trợ dữ liệu phụ trợ mà không cung cấp chức năng này. Cũng lưu ý rằng việc đặt kích thước bộ đệm bằng cách sử dụng kết quả của hàm này có thể không giới hạn chính xác lượng dữ liệu phụ trợ có thể nhận được vì dữ liệu bổ sung có thể vừa với vùng đệm.

sẵn có: Unix, not WASI.

hầu hết các nền tảng Unix.

Added in version 3.3.

socket.getdefaulttimeout()

Trả về thời gian chờ mặc định tính bằng giây (float) cho các đối tượng ổ cắm mới. Giá trị None cho biết các đối tượng socket mới không có thời gian chờ. Khi mô-đun ổ cắm được nhập lần đầu tiên, mặc định là None.

socket.setdefaulttimeout(timeout)

Đặt thời gian chờ mặc định tính bằng giây (float) cho các đối tượng ổ cắm mới. Khi mô-đun ổ cắm được nhập lần đầu tiên, mặc định là None. Xem settimeout() để biết các giá trị có thể có và ý nghĩa tương ứng của chúng.

socket.sethostname(name)

Đặt tên máy chủ của máy thành name. Điều này sẽ tăng OSError nếu bạn không có đủ quyền.

Tăng một auditing event socket.sethostname với đối số name.

sẵn có: Unix, not Android.

Added in version 3.3.

socket.if_nameindex()

Trả về danh sách các bộ thông tin giao diện mạng (index int, name string). OSError nếu cuộc gọi hệ thống không thành công.

sẵn có: Unix, Windows, not WASI.

Added in version 3.3.

Thay đổi trong phiên bản 3.8: Hỗ trợ Windows đã được thêm vào.

Ghi chú

Trên giao diện mạng Windows có các tên khác nhau trong các ngữ cảnh khác nhau (tất cả các tên đều là ví dụ):

  • UUID: {FB605B73-AAC2-49A6-9A2F-25416AEA0573}

  • Tên: ethernet_32770

  • tên thân thiện: vEthernet (nat)

  • mô tả: Hyper-V Virtual Ethernet Adapter

Hàm này trả về tên của dạng thứ hai trong danh sách, ethernet_32770 trong trường hợp ví dụ này.

socket.if_nametoindex(if_name)

Trả về số chỉ mục giao diện mạng tương ứng với tên giao diện. OSError nếu không có giao diện nào có tên đã cho tồn tại.

sẵn có: Unix, Windows, not WASI.

Added in version 3.3.

Thay đổi trong phiên bản 3.8: Hỗ trợ Windows đã được thêm vào.

Xem thêm

"Tên giao diện" là tên được ghi trong if_nameindex().

socket.if_indextoname(if_index)

Trả về tên giao diện mạng tương ứng với số chỉ mục giao diện. OSError nếu không có giao diện nào có chỉ mục đã cho.

sẵn có: Unix, Windows, not WASI.

Added in version 3.3.

Thay đổi trong phiên bản 3.8: Hỗ trợ Windows đã được thêm vào.

Xem thêm

"Tên giao diện" là tên được ghi trong if_nameindex().

socket.send_fds(sock, buffers, fds[, flags[, address]])

Gửi danh sách mô tả tập tin fds qua ổ cắm AF_UNIX sock. Tham số fds là một chuỗi các bộ mô tả tệp. Tham khảo sendmsg() để biết tài liệu về các thông số này.

sẵn có: Unix, not WASI.

Nền tảng Unix hỗ trợ cơ chế sendmsg()SCM_RIGHTS.

Added in version 3.9.

socket.recv_fds(sock, bufsize, maxfds[, flags])

Nhận tối đa bộ mô tả tệp maxfds từ ổ cắm AF_UNIX sock. Trả về (msg, list(fds), flags, addr). Tham khảo recvmsg() để biết tài liệu về các thông số này.

sẵn có: Unix, not WASI.

Nền tảng Unix hỗ trợ cơ chế recvmsg()SCM_RIGHTS.

Added in version 3.9.

Ghi chú

Bất kỳ số nguyên bị cắt cụt nào ở cuối danh sách mô tả tệp.

Đối tượng ổ cắm

Các đối tượng socket có các phương thức sau. Ngoại trừ makefile(), những điều này tương ứng với các lệnh gọi hệ thống Unix áp dụng cho ổ cắm.

Thay đổi trong phiên bản 3.2: Hỗ trợ cho giao thức context manager đã được thêm vào. Thoát khỏi trình quản lý bối cảnh tương đương với việc gọi close().

socket.accept()

Chấp nhận một kết nối. Ổ cắm phải được liên kết với một địa chỉ và lắng nghe các kết nối. Giá trị trả về là một cặp (conn, address) trong đó conn là đối tượng ổ cắm new có thể sử dụng để gửi và nhận dữ liệu trên kết nối và address là địa chỉ được liên kết với ổ cắm ở đầu bên kia của kết nối.

Ổ cắm mới được tạo là non-inheritable.

Thay đổi trong phiên bản 3.4: Ổ cắm bây giờ không thể kế thừa được.

Thay đổi trong phiên bản 3.5: Nếu lệnh gọi hệ thống bị gián đoạn và trình xử lý tín hiệu không đưa ra ngoại lệ thì phương thức này sẽ thử lại lệnh gọi hệ thống thay vì đưa ra ngoại lệ InterruptedError (xem PEP 475 để biết lý do).

socket.bind(address)

Liên kết ổ cắm với address. Ổ cắm không được bị ràng buộc. Định dạng của address phụ thuộc vào họ địa chỉ --- xem Họ ổ cắm.

Tăng một auditing event socket.bind với các đối số self, address.

sẵn có: not WASI.

socket.close()

Đánh dấu ổ cắm đã đóng. Tài nguyên hệ thống cơ bản (ví dụ: bộ mô tả tệp) cũng bị đóng khi tất cả các đối tượng tệp từ makefile() bị đóng. Khi điều đó xảy ra, tất cả các thao tác trong tương lai trên đối tượng socket sẽ thất bại. Đầu từ xa sẽ không nhận được thêm dữ liệu (sau khi dữ liệu được xếp hàng đợi bị xóa).

Các ổ cắm sẽ tự động đóng khi chúng được thu gom rác, nhưng bạn nên close() chúng một cách rõ ràng hoặc sử dụng câu lệnh with xung quanh chúng.

Thay đổi trong phiên bản 3.6: OSError hiện được nâng lên nếu xảy ra lỗi khi thực hiện lệnh gọi close() cơ bản.

Ghi chú

close() giải phóng tài nguyên được liên kết với kết nối nhưng không nhất thiết phải đóng kết nối ngay lập tức. Nếu bạn muốn ngắt kết nối kịp thời, hãy gọi shutdown() trước close().

socket.connect(address)

Kết nối với ổ cắm từ xa tại address. Định dạng của address phụ thuộc vào họ địa chỉ --- xem Họ ổ cắm.

Nếu kết nối bị gián đoạn bởi một tín hiệu, phương thức sẽ đợi cho đến khi kết nối hoàn tất hoặc tăng TimeoutError khi hết thời gian chờ, nếu trình xử lý tín hiệu không đưa ra ngoại lệ và ổ cắm đang chặn hoặc có thời gian chờ. Đối với các ổ cắm không chặn, phương thức này sẽ đưa ra một ngoại lệ InterruptedError nếu kết nối bị gián đoạn bởi tín hiệu (hoặc ngoại lệ do trình xử lý tín hiệu đưa ra).

Tăng một auditing event socket.connect với các đối số self, address.

Thay đổi trong phiên bản 3.5: Phương thức này hiện chờ cho đến khi kết nối hoàn tất thay vì đưa ra ngoại lệ InterruptedError nếu kết nối bị gián đoạn bởi tín hiệu, bộ xử lý tín hiệu không đưa ra ngoại lệ và ổ cắm đang chặn hoặc có thời gian chờ (xem PEP 475 để biết lý do).

sẵn có: not WASI.

socket.connect_ex(address)

Giống như connect(address), nhưng trả về một chỉ báo lỗi thay vì đưa ra một ngoại lệ cho các lỗi được trả về bởi lệnh gọi connect() cấp C (các vấn đề khác, chẳng hạn như "không tìm thấy máy chủ" vẫn có thể đưa ra các ngoại lệ). Chỉ báo lỗi là 0 nếu thao tác thành công, nếu không thì giá trị của biến errno. Điều này rất hữu ích để hỗ trợ, chẳng hạn như kết nối không đồng bộ.

Tăng một auditing event socket.connect với các đối số self, address.

sẵn có: not WASI.

socket.detach()

Đặt đối tượng socket vào trạng thái đóng mà không thực sự đóng bộ mô tả tệp cơ bản. Bộ mô tả tệp được trả về và có thể được sử dụng lại cho các mục đích khác.

Added in version 3.2.

socket.dup()

Nhân đôi ổ cắm.

Ổ cắm mới được tạo là non-inheritable.

Thay đổi trong phiên bản 3.4: Ổ cắm bây giờ không thể kế thừa được.

sẵn có: not WASI.

socket.fileno()

Trả về bộ mô tả tệp của ổ cắm (một số nguyên nhỏ) hoặc -1 nếu thất bại. Điều này rất hữu ích với select.select().

Trong Windows, số nguyên nhỏ được trả về bằng phương thức này không thể được sử dụng khi có thể sử dụng bộ mô tả tệp (chẳng hạn như os.fdopen()). Unix không có giới hạn này.

socket.get_inheritable()

Lấy inheritable flag của bộ mô tả tệp của ổ cắm hoặc bộ điều khiển của ổ cắm: True nếu ổ cắm có thể được kế thừa trong các tiến trình con, False nếu không thể.

Added in version 3.4.

socket.getpeername()

Trả về địa chỉ từ xa mà ổ cắm được kết nối. Điều này rất hữu ích để tìm ra số cổng của ổ cắm IPv4/v6 từ xa chẳng hạn. Định dạng của địa chỉ được trả về tùy thuộc vào họ địa chỉ --- xem Họ ổ cắm. Trên một số hệ thống, chức năng này không được hỗ trợ.

socket.getsockname()

Trả về địa chỉ riêng của socket. Điều này rất hữu ích để tìm ra số cổng của ổ cắm IPv4/v6 chẳng hạn. Định dạng của địa chỉ được trả về tùy thuộc vào họ địa chỉ --- xem Họ ổ cắm.

socket.getsockopt(level, optname[, buflen])

Trả về giá trị của tùy chọn ổ cắm đã cho (xem trang Unix getsockopt(2)). Các hằng số ký hiệu cần thiết (SO_* etc.) được xác định trong mô-đun này. Nếu buflen vắng mặt, một tùy chọn số nguyên sẽ được giả sử và giá trị số nguyên của nó được hàm trả về. Nếu có buflen, nó chỉ định độ dài tối đa của bộ đệm được sử dụng để nhận tùy chọn và bộ đệm này được trả về dưới dạng đối tượng byte. Người gọi có quyền giải mã nội dung của bộ đệm (xem mô-đun tích hợp tùy chọn struct để biết cách giải mã các cấu trúc C được mã hóa dưới dạng chuỗi byte).

sẵn có: not WASI.

socket.getblocking()

Trả về True nếu ổ cắm ở chế độ chặn, False nếu ở chế độ không chặn.

Điều này tương đương với việc kiểm tra socket.gettimeout() != 0.

Added in version 3.7.

socket.gettimeout()

Trả về thời gian chờ tính bằng giây (float) liên quan đến thao tác ổ cắm hoặc None nếu không đặt thời gian chờ. Điều này phản ánh lệnh gọi cuối cùng tới setblocking() hoặc settimeout().

socket.ioctl(control, option)

Phương thức ioctl() là một giao diện giới hạn đối với giao diện hệ thống WSAIoctl. Vui lòng tham khảo Win32 documentation để biết thêm thông tin.

Trên các nền tảng khác, các chức năng fcntl.fcntl()fcntl.ioctl() chung có thể được sử dụng; họ chấp nhận một đối tượng socket làm đối số đầu tiên của họ.

Hiện tại chỉ hỗ trợ các mã điều khiển sau: SIO_RCVALL, SIO_KEEPALIVE_VALSSIO_LOOPBACK_FAST_PATH.

sẵn có: Windows

Thay đổi trong phiên bản 3.6: SIO_LOOPBACK_FAST_PATH đã được thêm vào.

socket.listen([backlog])

Cho phép máy chủ chấp nhận kết nối. Nếu chỉ định backlog thì ít nhất phải bằng 0 (nếu thấp hơn thì đặt thành 0); nó chỉ định số lượng kết nối không được chấp nhận mà hệ thống sẽ cho phép trước khi từ chối các kết nối mới. Nếu không được chỉ định, giá trị hợp lý mặc định sẽ được chọn.

sẵn có: not WASI.

Thay đổi trong phiên bản 3.5: Tham số backlog hiện là tùy chọn.

socket.makefile(mode='r', buffering=None, *, encoding=None, errors=None, newline=None)

Trả về file object được liên kết với ổ cắm. Kiểu trả về chính xác phụ thuộc vào các đối số được cung cấp cho makefile(). Các đối số này được diễn giải theo cách tương tự như hàm open() tích hợp, ngoại trừ các giá trị mode được hỗ trợ duy nhất là 'r' (mặc định), 'w', 'b' hoặc kết hợp các giá trị đó.

Ổ cắm phải ở chế độ chặn; nó có thể có thời gian chờ, nhưng bộ đệm bên trong của đối tượng tệp có thể ở trạng thái không ổn định nếu xảy ra thời gian chờ.

Việc đóng đối tượng tệp được trả về bởi makefile() sẽ không đóng ổ cắm ban đầu trừ khi tất cả các đối tượng tệp khác đã bị đóng và socket.close() đã được gọi trên đối tượng ổ cắm.

Ghi chú

Trên Windows, đối tượng giống như tệp được tạo bởi makefile() không thể được sử dụng khi cần có một đối tượng tệp có bộ mô tả tệp, chẳng hạn như đối số luồng của subprocess.Popen().

socket.recv(bufsize[, flags])

Nhận dữ liệu từ ổ cắm. Giá trị trả về là một đối tượng byte biểu thị dữ liệu nhận được. Lượng dữ liệu tối đa được nhận cùng một lúc được chỉ định bởi bufsize. Đối tượng byte trống được trả về cho biết máy khách đã bị ngắt kết nối. Xem trang hướng dẫn sử dụng Unix recv(2) để biết ý nghĩa của đối số tùy chọn flags; nó mặc định là 0.

Thay đổi trong phiên bản 3.5: Nếu lệnh gọi hệ thống bị gián đoạn và trình xử lý tín hiệu không đưa ra ngoại lệ thì phương thức này sẽ thử lại lệnh gọi hệ thống thay vì đưa ra ngoại lệ InterruptedError (xem PEP 475 để biết lý do).

socket.recvfrom(bufsize[, flags])

Nhận dữ liệu từ ổ cắm. Giá trị trả về là một cặp (bytes, address) trong đó bytes là đối tượng byte biểu thị dữ liệu nhận được và address là địa chỉ của ổ cắm gửi dữ liệu. Xem trang hướng dẫn sử dụng Unix recv(2) để biết ý nghĩa của đối số tùy chọn flags; nó mặc định là 0. Định dạng của address phụ thuộc vào họ địa chỉ --- xem Họ ổ cắm.

Thay đổi trong phiên bản 3.5: Nếu lệnh gọi hệ thống bị gián đoạn và trình xử lý tín hiệu không đưa ra ngoại lệ thì phương thức này sẽ thử lại lệnh gọi hệ thống thay vì đưa ra ngoại lệ InterruptedError (xem PEP 475 để biết lý do).

Thay đổi trong phiên bản 3.7: Đối với địa chỉ IPv6 multicast, mục đầu tiên của address không còn chứa phần %scope_id nữa. Để có được địa chỉ IPv6 đầy đủ, hãy sử dụng getnameinfo().

socket.recvmsg(bufsize[, ancbufsize[, flags]])

Nhận dữ liệu bình thường (tối đa bufsize byte) và dữ liệu phụ trợ từ ổ cắm. Đối số ancbufsize đặt kích thước tính bằng byte của bộ đệm trong được sử dụng để nhận dữ liệu phụ trợ; nó mặc định là 0, nghĩa là sẽ không nhận được dữ liệu phụ trợ. Kích thước bộ đệm phù hợp cho dữ liệu phụ trợ có thể được tính toán bằng cách sử dụng CMSG_SPACE() hoặc CMSG_LEN() và các mục không vừa với bộ đệm có thể bị cắt bớt hoặc loại bỏ. Đối số flags mặc định là 0 và có cùng ý nghĩa như đối với recv().

Giá trị trả về là 4 bộ: (data, ancdata, msg_flags, address). Mục data là đối tượng bytes chứa dữ liệu không phụ trợ nhận được. Mục ancdata là danh sách gồm 0 hoặc nhiều bộ dữ liệu (cmsg_level, cmsg_type, cmsg_data) đại diện cho dữ liệu phụ trợ (thông báo điều khiển) nhận được: cmsg_levelcmsg_type lần lượt là các số nguyên chỉ định cấp độ giao thức và loại giao thức cụ thể và cmsg_data là đối tượng bytes chứa dữ liệu liên quan. Mục msg_flags là bitwise HOẶC của các cờ khác nhau biểu thị các điều kiện trên tin nhắn nhận được; xem tài liệu hệ thống của bạn để biết chi tiết. Nếu ổ cắm nhận chưa được kết nối, address là địa chỉ của ổ cắm gửi, nếu có; mặt khác, giá trị của nó không được chỉ định.

Trên một số hệ thống, sendmsg()recvmsg() có thể được sử dụng để chuyển các bộ mô tả tệp giữa các tiến trình qua ổ cắm AF_UNIX. Khi tiện ích này được sử dụng (nó thường bị giới hạn ở ổ cắm SOCK_STREAM), recvmsg() sẽ trả về, trong dữ liệu phụ trợ của nó, các mục có dạng (socket.SOL_SOCKET, socket.SCM_RIGHTS, fds), trong đó fds là đối tượng bytes đại diện cho bộ mô tả tệp mới dưới dạng mảng nhị phân của loại C int gốc. Nếu recvmsg() đưa ra một ngoại lệ sau khi lệnh gọi hệ thống trả về, trước tiên nó sẽ cố gắng đóng mọi bộ mô tả tệp nhận được thông qua cơ chế này.

Một số hệ thống không chỉ ra độ dài bị cắt ngắn của các mục dữ liệu phụ trợ chỉ được nhận một phần. Nếu một mục có vẻ vượt ra ngoài phần cuối của bộ đệm, recvmsg() sẽ phát ra RuntimeWarning và sẽ trả về phần của nó nằm trong bộ đệm với điều kiện nó chưa bị cắt bớt trước khi bắt đầu dữ liệu liên quan.

Trên các hệ thống hỗ trợ cơ chế SCM_RIGHTS, chức năng sau sẽ nhận tối đa các bộ mô tả tệp maxfds, trả về dữ liệu thông báo và danh sách chứa các bộ mô tả (trong khi bỏ qua các điều kiện không mong muốn như nhận được các thông báo điều khiển không liên quan). Xem thêm sendmsg().

nhập  cắm, mảng

def recv_fds(sock, msglen, maxfds):
    fds = array.array("i") # Array của số nguyên
    tin nhắn, ancdata, flags, addr = sock.recvmsg(msglen, socket.CMSG_LEN(maxfds * fds.itemsize))
    cho cmsg_level, cmsg_type, cmsg_data trong ancdata:
        nếu cmsg_level == socket.SOL_SOCKET  cmsg_type == socket.SCM_RIGHTS:
            # Append, bỏ qua mọi số nguyên bị cắt cụt ở cuối.
            fds.frombytes(cmsg_data[:len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
    tin nhắn trả về, danh sách (fds)

sẵn có: Unix.

Hầu hết các nền tảng Unix.

Added in version 3.3.

Thay đổi trong phiên bản 3.5: Nếu lệnh gọi hệ thống bị gián đoạn và trình xử lý tín hiệu không đưa ra ngoại lệ thì phương thức này sẽ thử lại lệnh gọi hệ thống thay vì đưa ra ngoại lệ InterruptedError (xem PEP 475 để biết lý do).

socket.recvmsg_into(buffers[, ancbufsize[, flags]])

Nhận dữ liệu bình thường và dữ liệu phụ trợ từ ổ cắm, hoạt động giống như recvmsg(), nhưng phân tán dữ liệu không phụ trợ vào một loạt bộ đệm thay vì trả về một đối tượng byte mới. Đối số buffers phải là đối tượng có thể lặp lại để xuất bộ đệm có thể ghi (ví dụ: đối tượng bytearray); những phần này sẽ chứa đầy các khối dữ liệu không phụ trợ liên tiếp cho đến khi tất cả được ghi hoặc không còn bộ đệm nữa. Hệ điều hành có thể đặt giới hạn (giá trị sysconf() SC_IOV_MAX) về số lượng bộ đệm có thể được sử dụng. Các đối số ancbufsizeflags có cùng ý nghĩa như đối với recvmsg().

Giá trị trả về là 4 bộ: (nbytes, ancdata, msg_flags, address), trong đó nbytes là tổng số byte dữ liệu không phụ trợ được ghi vào bộ đệm và ancdata, msg_flagsaddress giống như đối với recvmsg().

Ví dụ:

>>> nhập khẩu  cắm
>>> s1, s2 = socket.socketpair()
>>> b1 = bytearray(b'----')
>>> b2 = bytearray(b'0123456789')
>>> b3 = bytearray(b'--------------')
>>> s1.send(b'Mary có một con cừu nhỏ')
22
>>> s2.recvmsg_into([b1, Memoryview(b2)[2:9], b3])
(22, [], 0, Không có)
>>> [b1, b2, b3]
[bytearray(b'Mary'), bytearray(b'01 có 9'), bytearray(b'con cừu nhỏ---')]

sẵn có: Unix.

Hầu hết các nền tảng Unix.

Added in version 3.3.

socket.recvfrom_into(buffer[, nbytes[, flags]])

Nhận dữ liệu từ ổ cắm, ghi dữ liệu vào buffer thay vì tạo chuỗi byte mới. Giá trị trả về là một cặp (nbytes, address) trong đó nbytes là số byte nhận được và address là địa chỉ của socket gửi dữ liệu. Xem trang hướng dẫn sử dụng Unix recv(2) để biết ý nghĩa của đối số tùy chọn flags; nó mặc định là 0. Định dạng của address phụ thuộc vào họ địa chỉ --- xem Họ ổ cắm.

socket.recv_into(buffer[, nbytes[, flags]])

Nhận tối đa nbytes byte từ ổ cắm, lưu trữ dữ liệu vào bộ đệm thay vì tạo chuỗi byte mới. Nếu nbytes không được chỉ định (hoặc 0), hãy nhận tối đa kích thước có sẵn trong bộ đệm đã cho. Trả về số byte nhận được. Xem trang hướng dẫn Unix recv(2) để biết ý nghĩa của đối số tùy chọn flags; nó mặc định là 0.

socket.send(bytes[, flags])

Gửi dữ liệu đến ổ cắm. Ổ cắm phải được kết nối với ổ cắm từ xa. Đối số flags tùy chọn có ý nghĩa tương tự như đối với recv(). Trả về số byte đã gửi. Ứng dụng có trách nhiệm kiểm tra xem tất cả dữ liệu đã được gửi chưa; nếu chỉ một số dữ liệu được truyền đi thì ứng dụng cần thử phân phối dữ liệu còn lại. Để biết thêm thông tin về chủ đề này, hãy tham khảo Lập trình socket HOWTO.

Thay đổi trong phiên bản 3.5: Nếu lệnh gọi hệ thống bị gián đoạn và trình xử lý tín hiệu không đưa ra ngoại lệ thì phương thức này sẽ thử lại lệnh gọi hệ thống thay vì đưa ra ngoại lệ InterruptedError (xem PEP 475 để biết lý do).

socket.sendall(bytes[, flags])

Gửi dữ liệu đến ổ cắm. Ổ cắm phải được kết nối với ổ cắm từ xa. Đối số flags tùy chọn có ý nghĩa tương tự như đối với recv(). Không giống như send(), phương thức này tiếp tục gửi dữ liệu từ bytes cho đến khi tất cả dữ liệu đã được gửi hoặc xảy ra lỗi. None được trả về thành công. Nếu có lỗi, một ngoại lệ sẽ được đưa ra và không có cách nào để xác định lượng dữ liệu, nếu có, đã được gửi thành công.

Thay đổi trong phiên bản 3.5: Thời gian chờ của ổ cắm không còn được đặt lại mỗi khi dữ liệu được gửi thành công. Thời gian chờ của ổ cắm hiện là tổng thời lượng tối đa để gửi tất cả dữ liệu.

Thay đổi trong phiên bản 3.5: Nếu lệnh gọi hệ thống bị gián đoạn và trình xử lý tín hiệu không đưa ra ngoại lệ thì phương thức này sẽ thử lại lệnh gọi hệ thống thay vì đưa ra ngoại lệ InterruptedError (xem PEP 475 để biết lý do).

socket.sendto(bytes, address)
socket.sendto(bytes, flags, address)

Gửi dữ liệu đến ổ cắm. Không nên kết nối ổ cắm với ổ cắm từ xa vì ổ cắm đích được chỉ định bởi address. Đối số flags tùy chọn có ý nghĩa tương tự như đối với recv(). Trả về số byte đã gửi. Định dạng của address phụ thuộc vào họ địa chỉ --- xem Họ ổ cắm.

Tăng một auditing event socket.sendto với các đối số self, address.

Thay đổi trong phiên bản 3.5: Nếu lệnh gọi hệ thống bị gián đoạn và trình xử lý tín hiệu không đưa ra ngoại lệ thì phương thức này sẽ thử lại lệnh gọi hệ thống thay vì đưa ra ngoại lệ InterruptedError (xem PEP 475 để biết lý do).

socket.sendmsg(buffers[, ancdata[, flags[, address]]])

Gửi dữ liệu thông thường và phụ trợ đến ổ cắm, thu thập dữ liệu không phụ trợ từ một loạt bộ đệm và ghép nó thành một tin nhắn duy nhất. Đối số buffers chỉ định dữ liệu không phụ trợ dưới dạng có thể lặp lại của bytes-like objects (ví dụ: đối tượng bytes); hệ điều hành có thể đặt giới hạn (giá trị sysconf() SC_IOV_MAX) về số lượng bộ đệm có thể được sử dụng. Đối số ancdata chỉ định dữ liệu phụ trợ (thông báo điều khiển) dưới dạng có thể lặp lại từ 0 hoặc nhiều bộ (cmsg_level, cmsg_type, cmsg_data), trong đó cmsg_levelcmsg_type là các số nguyên chỉ định cấp độ giao thức và loại giao thức cụ thể tương ứng và cmsg_data là một đối tượng giống byte chứa dữ liệu liên quan. Lưu ý rằng một số hệ thống (đặc biệt là các hệ thống không có CMSG_SPACE()) có thể chỉ hỗ trợ gửi một tin nhắn điều khiển cho mỗi cuộc gọi. Đối số flags mặc định là 0 và có cùng ý nghĩa như đối với send(). Nếu address được cung cấp chứ không phải None, nó sẽ đặt địa chỉ đích cho tin nhắn. Giá trị trả về là số byte dữ liệu không phụ trợ được gửi.

Hàm sau gửi danh sách mô tả tệp fds qua ổ cắm AF_UNIX, trên các hệ thống hỗ trợ cơ chế SCM_RIGHTS. Xem thêm recvmsg().

nhập  cắm, mảng

def send_fds(sock, msg, fds):
    return sock.sendmsg([msg], [(socket.SOL_SOCKET, socket.SCM_RIGHTS, array.array("i", fds))])

sẵn có: Unix, not WASI.

Hầu hết các nền tảng Unix.

Tăng một auditing event socket.sendmsg với các đối số self, address.

Added in version 3.3.

Thay đổi trong phiên bản 3.5: Nếu lệnh gọi hệ thống bị gián đoạn và trình xử lý tín hiệu không đưa ra ngoại lệ thì phương thức này sẽ thử lại lệnh gọi hệ thống thay vì đưa ra ngoại lệ InterruptedError (xem PEP 475 để biết lý do).

socket.sendmsg_afalg([msg, ]*, op[, iv[, assoclen[, flags]]])

Phiên bản chuyên dụng của sendmsg() dành cho socket AF_ALG. Đặt chế độ, IV, độ dài dữ liệu liên quan đến AEAD và cờ cho ổ cắm AF_ALG.

sẵn có: Linux >= 2.6.38.

Added in version 3.6.

socket.sendfile(file, offset=0, count=None)

Gửi tệp cho đến khi đạt được EOF bằng cách sử dụng os.sendfile hiệu suất cao và trả về tổng số byte đã được gửi. file phải là đối tượng tệp thông thường được mở ở chế độ nhị phân. Nếu os.sendfile không có sẵn (ví dụ: Windows) hoặc file không phải là tệp thông thường, send() sẽ được sử dụng thay thế. offset cho biết bắt đầu đọc tệp từ đâu. Nếu được chỉ định, count là tổng số byte cần truyền thay vì gửi tệp cho đến khi đạt được EOF. Vị trí tệp được cập nhật khi trả về hoặc trong trường hợp có lỗi, trong trường hợp đó, file.tell() có thể được sử dụng để tìm ra số byte đã được gửi. Ổ cắm phải là loại SOCK_STREAM. Ổ cắm không chặn không được hỗ trợ.

Added in version 3.5.

socket.set_inheritable(inheritable)

Đặt inheritable flag của bộ mô tả tệp của ổ cắm hoặc tay cầm của ổ cắm.

Added in version 3.4.

socket.setblocking(flag)

Đặt chế độ chặn hoặc không chặn của ổ cắm: nếu flag sai, ổ cắm được đặt thành không chặn, nếu không thì thành chế độ chặn.

Phương thức này là cách viết tắt cho một số lệnh gọi settimeout() nhất định:

  • sock.setblocking(True) tương đương với sock.settimeout(None)

  • sock.setblocking(False) tương đương với sock.settimeout(0.0)

Thay đổi trong phiên bản 3.7: Phương pháp này không còn áp dụng cờ SOCK_NONBLOCK trên socket.type nữa.

socket.settimeout(value)

Đặt thời gian chờ để chặn hoạt động của ổ cắm. Đối số value có thể là số dấu phẩy động không âm biểu thị giây hoặc None. Nếu giá trị khác 0 được đưa ra, các thao tác ổ cắm tiếp theo sẽ đưa ra ngoại lệ timeout nếu khoảng thời gian chờ value đã trôi qua trước khi thao tác hoàn tất. Nếu giá trị bằng 0, ổ cắm được đặt ở chế độ không chặn. Nếu None được cung cấp, ổ cắm sẽ được đặt ở chế độ chặn.

Để biết thêm thông tin, vui lòng tham khảo notes on socket timeouts.

Thay đổi trong phiên bản 3.7: Phương thức này không còn bật cờ SOCK_NONBLOCK trên socket.type nữa.

socket.setsockopt(level, optname, value: int | Buffer)
socket.setsockopt(level, optname, None, optlen: int)

Đặt giá trị của tùy chọn ổ cắm đã cho (xem trang hướng dẫn sử dụng Unix setsockopt(2)). Các hằng số ký hiệu cần thiết được xác định trong mô-đun này (SO_* etc. <socket-unix-constants>). Giá trị có thể là số nguyên, None hoặc bytes-like object đại diện cho bộ đệm. Trong trường hợp sau, người gọi có trách nhiệm đảm bảo rằng chuỗi byte chứa các bit thích hợp (xem mô-đun tích hợp tùy chọn struct để biết cách mã hóa cấu trúc C dưới dạng chuỗi byte). Khi value được đặt thành None, đối số optlen là bắt buộc. Nó tương đương với việc gọi hàm setsockopt() C với optval=NULLoptlen=optlen.

Thay đổi trong phiên bản 3.5: bytes-like object có thể ghi hiện đã được chấp nhận.

Thay đổi trong phiên bản 3.6: setsockopt(level, optname, None, optlen: int) đã được thêm vào.

sẵn có: not WASI.

socket.shutdown(how)

Tắt một hoặc cả hai nửa kết nối. Nếu howSHUT_RD thì việc nhận thêm sẽ không được phép. Nếu howSHUT_WR, việc gửi thêm sẽ không được phép. Nếu howSHUT_RDWR, việc gửi và nhận tiếp theo sẽ không được phép.

sẵn có: not WASI.

socket.share(process_id)

Sao chép một ổ cắm và chuẩn bị nó để chia sẻ với một quy trình đích. Quá trình mục tiêu phải được cung cấp process_id. Sau đó, đối tượng byte kết quả có thể được chuyển đến tiến trình đích bằng cách sử dụng một số hình thức giao tiếp giữa các tiến trình và ổ cắm có thể được tạo lại ở đó bằng cách sử dụng fromshare(). Khi phương thức này đã được gọi, việc đóng ổ cắm là an toàn vì hệ điều hành đã sao chép nó cho quy trình đích.

sẵn có: Windows.

Added in version 3.3.

Lưu ý rằng không có phương pháp read() hoặc write(); thay vào đó hãy sử dụng recv()send() mà không có đối số flags.

Các đối tượng socket cũng có các thuộc tính (chỉ đọc) này tương ứng với các giá trị được cung cấp cho hàm tạo socket.

socket.family

Gia đình ổ cắm.

socket.type

Loại ổ cắm.

socket.proto

Giao thức ổ cắm.

Lưu ý về thời gian chờ của ổ cắm

Một đối tượng socket có thể ở một trong ba chế độ: chặn, không chặn hoặc hết thời gian chờ. Theo mặc định, các ổ cắm luôn được tạo ở chế độ chặn, nhưng điều này có thể được thay đổi bằng cách gọi setdefaulttimeout().

  • Trong blocking mode, khối hoạt động cho đến khi hoàn thành hoặc hệ thống trả về lỗi (chẳng hạn như hết thời gian kết nối).

  • Trong non-blocking mode, các thao tác không thành công (không may là lỗi phụ thuộc vào hệ thống) nếu chúng không thể được hoàn thành ngay lập tức: các chức năng từ mô-đun select có thể được sử dụng để biết khi nào và liệu ổ cắm có sẵn để đọc hoặc ghi hay không.

  • Trong timeout mode, các thao tác không thành công nếu chúng không thể hoàn thành trong khoảng thời gian chờ được chỉ định cho ổ cắm (chúng đưa ra ngoại lệ timeout) hoặc nếu hệ thống trả về lỗi.

Ghi chú

Ở cấp hệ điều hành, các ổ cắm trong timeout mode được đặt bên trong ở chế độ không chặn. Ngoài ra, các chế độ chặn và hết thời gian chờ được chia sẻ giữa các bộ mô tả tệp và các đối tượng ổ cắm tham chiếu đến cùng một điểm cuối mạng. Chi tiết triển khai này có thể gây ra hậu quả rõ ràng nếu ví dụ: bạn quyết định sử dụng fileno() của ổ cắm.

Thời gian chờ và phương pháp connect

Hoạt động connect() cũng tuân theo cài đặt thời gian chờ và nói chung nên gọi settimeout() trước khi gọi connect() hoặc chuyển tham số hết thời gian chờ cho create_connection(). Tuy nhiên, ngăn xếp mạng hệ thống cũng có thể tự trả về lỗi hết thời gian kết nối bất kể cài đặt thời gian chờ của ổ cắm Python nào.

Thời gian chờ và phương pháp accept

Nếu getdefaulttimeout() không phải là None, các ổ cắm được trả về bằng phương thức accept() sẽ kế thừa thời gian chờ đó. Mặt khác, hành vi phụ thuộc vào cài đặt của ổ cắm nghe:

  • nếu ổ cắm nghe nằm ở blocking mode hoặc timeout mode thì ổ cắm được trả về bởi accept() nằm ở blocking mode;

  • nếu ổ cắm nghe ở non-blocking mode, thì ổ cắm được accept() trả về ở chế độ chặn hay không chặn sẽ phụ thuộc vào hệ điều hành. Nếu muốn đảm bảo hoạt động đa nền tảng, bạn nên ghi đè cài đặt này theo cách thủ công.

Ví dụ

Dưới đây là bốn chương trình ví dụ tối thiểu sử dụng giao thức TCP/IP: một máy chủ phản hồi tất cả dữ liệu mà nó nhận được (chỉ phục vụ một máy khách) và một máy khách sử dụng nó. Lưu ý rằng máy chủ phải thực hiện chuỗi socket(), bind(), listen(), accept() (có thể lặp lại accept() để phục vụ nhiều khách hàng), trong khi máy khách chỉ cần chuỗi socket(), connect(). Cũng lưu ý rằng máy chủ không sendall()/recv() trên ổ cắm mà nó đang nghe mà trên ổ cắm mới được accept() trả về.

Hai ví dụ đầu tiên chỉ hỗ trợ IPv4.

chương trình máy chủ # Echo
 cắm nhập khẩu

HOST = '' tên # Symbolic nghĩa là tất cả các giao diện có sẵn
PORT = 50007 cổng không  đặc quyền # Arbitrary
với socket.socket(socket.AF_INET, socket.SOCK_STREAM)  s:
    s.bind((HOST, PORT))
    s.lắng nghe(1)
    kết nối, addr = s.accept()
    với conn:
        print('Được kết nối bởi', addr)
        trong khi Đúng:
            dữ liệu = conn.recv(1024)
            nếu không phải dữ liệu: phá vỡ
            conn.sendall(dữ liệu)
chương trình khách hàng # Echo
 cắm nhập khẩu

HOST = 'daring.cwi.nl' # The máy chủ từ xa
PORT = 50007 # The cùng một cổng được máy chủ sử dụng
với socket.socket(socket.AF_INET, socket.SOCK_STREAM)  s:
    s.connect((HOST, PORT))
    s.sendall(b'Xin chào thế giới')
    dữ liệu = s.recv(1024)
print('Đã nhận', Repr(dữ liệu))

Hai ví dụ tiếp theo giống hệt hai ví dụ trên nhưng hỗ trợ cả IPv4 và IPv6. Phía máy chủ sẽ lắng nghe họ địa chỉ đầu tiên có sẵn (thay vào đó, nó nên lắng nghe cả hai). Trên hầu hết các hệ thống sẵn sàng cho IPv6, IPv6 sẽ được ưu tiên và máy chủ có thể không chấp nhận lưu lượng IPv4. Phía máy khách sẽ cố gắng kết nối với tất cả các địa chỉ được trả về do quá trình phân giải tên và gửi lưu lượng truy cập đến địa chỉ đầu tiên được kết nối thành công.

chương trình máy chủ # Echo
 cắm nhập khẩu
hệ thống nhập khẩu

HOST = Không  tên # Symbolic nghĩa là tất cả các giao diện có sẵn
PORT = 50007 cổng không  đặc quyền # Arbitrary
s = Không
cho độ phân giải trong socket.getaddrinfo(HOST, PORT, socket.AF_UNSPEC,
                              socket.SOCK_STREAM, 0, socket.AI_PASSIVE):
    af, socktype, proto, canonname, sa = res
    thử:
        s = socket.socket(af, socktype, proto)
    ngoại trừ OSError dưới dạng thông báo:
        s = Không
        tiếp tục
    thử:
        s.bind(sa)
        s.lắng nghe(1)
    ngoại trừ OSError dưới dạng thông báo:
        s.close()
        s = Không
        tiếp tục
    phá vỡ
nếu s  Không:
    print('không thể mở ổ cắm')
    sys.exit(1)
kết nối, addr = s.accept()
với conn:
    print('Được kết nối bởi', addr)
    trong khi Đúng:
        dữ liệu = conn.recv(1024)
        nếu không phải dữ liệu: phá vỡ
        conn.send(dữ liệu)
chương trình khách hàng # Echo
 cắm nhập khẩu
hệ thống nhập khẩu

HOST = 'daring.cwi.nl' # The máy chủ từ xa
PORT = 50007 # The cùng một cổng được máy chủ sử dụng
s = Không
đối với độ phân giải trong socket.getaddrinfo(HOST, PORT, socket.AF_UNSPEC, socket.SOCK_STREAM):
    af, socktype, proto, canonname, sa = res
    thử:
        s = socket.socket(af, socktype, proto)
    ngoại trừ OSError dưới dạng thông báo:
        s = Không
        tiếp tục
    thử:
        s.connect(sa)
    ngoại trừ OSError dưới dạng thông báo:
        s.close()
        s = Không
        tiếp tục
    phá vỡ
nếu s  Không:
    print('không thể mở ổ cắm')
    sys.exit(1)
với s:
    s.sendall(b'Xin chào thế giới')
    dữ liệu = s.recv(1024)
print('Đã nhận', Repr(dữ liệu))

Ví dụ tiếp theo cho thấy cách viết một trình thám thính mạng rất đơn giản với các ổ cắm thô trên Windows. Ví dụ yêu cầu đặc quyền của quản trị viên để sửa đổi giao diện:

 cắm nhập khẩu

giao diện mạng công cộng # the
HOST = socket.gethostbyname(socket.gethostname())

# create một ổ cắm thô và liên kết nó với giao diện chung
s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_IP)
s.bind((HOST, 0))

tiêu đề IP # Include
s.setsockopt(socket.IPPROTO_IP, socket.IP_HDRINCL, 1)

# receive tất cả các gói
s.ioctl(socket.SIO_RCVALL, socket.RCVALL_ON)

# receive một gói
print(s.recvfrom(65565))

# disabled chế độ lăng nhăng
s.ioctl(socket.SIO_RCVALL, socket.RCVALL_OFF)

Ví dụ tiếp theo cho thấy cách sử dụng giao diện ổ cắm để giao tiếp với mạng CAN bằng giao thức ổ cắm thô. Thay vào đó, để sử dụng CAN với giao thức trình quản lý phát sóng, hãy mở một ổ cắm bằng:

socket.socket(socket.AF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM)

Sau khi liên kết (CAN_RAW) hoặc kết nối (CAN_BCM) ổ cắm, bạn có thể sử dụng các thao tác socket.send()socket.recv() (và các thao tác tương ứng của chúng) trên đối tượng ổ cắm như bình thường.

Ví dụ cuối cùng này có thể yêu cầu các đặc quyền:

 cắm nhập khẩu
nhập cấu trúc


Đóng gói/giải nén khung # CAN (xem 'struct can_frame' trong <linux/can.h>)

can_frame_fmt = "=IB3x8s"
can_frame_size = struct.calcsize(can_frame_fmt)

def build_can_frame(can_id, dữ liệu):
    can_dlc = len(dữ liệu)
    dữ liệu = data.ljust(8, b'\x00')
    trả về struct.pack(can_frame_fmt, can_id, can_dlc, data)

def mổ xẻ_can_frame(khung):
    can_id, can_dlc, data = struct.unpack(can_frame_fmt, frame)
    trả về (can_id, can_dlc, data[:can_dlc])


# create một ổ cắm thô và liên kết nó với giao diện 'vcan0'
s = socket.socket(socket.AF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
s.bind(('vcan0',))

trong khi Đúng:
    cf, addr = s.recvfrom(can_frame_size)

    print('Đã nhận: can_id=%x, can_dlc=%x, data=%s' % dissect_can_frame(cf))

    thử:
        s.send(cf)
    ngoại trừ OSError:
        print('Lỗi gửi khung CAN')

    thử:
        s.send(build_can_frame(0x01, b'\x01\x02\x03'))
    ngoại trừ OSError:
        print('Lỗi gửi khung CAN')

Việc chạy một ví dụ nhiều lần với độ trễ quá nhỏ giữa các lần thực thi có thể dẫn đến lỗi này:

OSError: [Errno 98] Địa chỉ đã được sử dụng

Điều này là do quá trình thực thi trước đó đã khiến ổ cắm ở trạng thái TIME_WAIT và không thể sử dụng lại ngay lập tức.

Có một cờ socket cần đặt, để ngăn chặn điều này, socket.SO_REUSEADDR:

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind((HOST, PORT))

cờ SO_REUSEADDR yêu cầu kernel sử dụng lại ổ cắm cục bộ ở trạng thái TIME_WAIT mà không cần đợi hết thời gian chờ tự nhiên.

Xem thêm

Để biết phần giới thiệu về lập trình socket (bằng C), hãy xem các bài viết sau:

  • An Introductory 4.3BSD Interprocess Communication Tutorial, bởi Stuart Sechrest

  • An Advanced 4.3BSD Interprocess Communication Tutorial, bởi Samuel J. Leffler và cộng sự,

cả trong Hướng dẫn lập trình viên UNIX, Tài liệu bổ sung 1 (phần PS1:7 và PS1:8). Tài liệu tham khảo dành riêng cho nền tảng cho các lệnh gọi hệ thống liên quan đến ổ cắm khác nhau cũng là nguồn thông tin có giá trị về chi tiết ngữ nghĩa của ổ cắm. Đối với Unix, hãy tham khảo các trang hướng dẫn; đối với Windows, hãy xem thông số kỹ thuật WinSock (hoặc Winsock 2). Đối với các API sẵn sàng cho IPv6, người đọc có thể tham khảo RFC 3493 có tiêu đề Tiện ích mở rộng giao diện ổ cắm cơ bản cho IPv6.