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() và 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'và 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 choINADDR_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 choINADDR_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 đó flowinfo và scope_id đại diện cho các thành viênsin6_flowinfovàsin6_scope_idtrongstruct sockaddr_in6trong C. Đối với các phương thức mô-đunsocket, flowinfo và scope_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ặczone 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_NAMEhoặcTIPC_ADDR_ID.scope là một trong
TIPC_ZONE_SCOPE,TIPC_CLUSTER_SCOPEvàTIPC_NODE_SCOPE.Nếu addr_type là
TIPC_ADDR_NAMEthì v1 là loại máy chủ, v2 là mã định danh cổng và v3 phải là 0.Nếu addr_type là
TIPC_ADDR_NAMESEQthì 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_type là
TIPC_ADDR_IDthì 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_ISOTPyê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_J1939yê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ứcSYSPROTO_CONTROLcủ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_BLUETOOTHhỗ trợ các giao thức và định dạng địa chỉ sau:BTPROTO_L2CAPchấp nhận một bộ(bdaddr, psm[, cid[, bdaddr_type]])trong đó:bdaddrlà một chuỗi chỉ định địa chỉ Bluetooth.psmlà một số nguyên chỉ định Bộ ghép kênh giao thức/dịch vụ.cidlà 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_typelà số nguyên tùy chọn chỉ định loại địa chỉ; một trongBDADDR_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
cidvàbdaddr_type.BTPROTO_RFCOMMchấp nhận(bdaddr, channel)trong đóbdaddrlà địa chỉ Bluetooth dưới dạng chuỗi vàchannellà số nguyên.BTPROTO_HCIchấ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_idhoặc một bộ(device_id, [channel])trong đódevice_idchỉ định số lượng thiết bị Bluetooth vàchannellà một số nguyên tùy chọn chỉ định kênh HCI (HCI_CHANNEL_RAWtheo mặc định).Trên FreeBSD, NetBSD và DragonFly BSD, nó chấp nhận
bdaddrtrong đóbdaddrlà đị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_idkhông được đóng gói trong bộ dữ liệu hiện được chấp nhận.BTPROTO_SCOchấp nhậnbdaddrtrong đóbdaddrlà địa chỉ Bluetooth dưới dạng chuỗi hoặc đối tượngbytes. (ví dụ:'12:23:34:45:56:67'hoặcb'12:23:34:45:56:67')Thay đổi trong phiên bản 3.14: Đã thêm hỗ trợ FreeBSD.
AF_ALGlà 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,skcipherhoặcrng.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ặcdrbg_nopr_ctr_aes256.feat và mask 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_VSOCKcho 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.Added in version 3.7.
AF_PACKETlà 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_QIPCRTRlà 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 đó node và port là các số nguyên không âm.sẵn có: Linux >= 4.7.
Added in version 3.8.
IPPROTO_UDPLITElà 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,lengthphải ở dạngrange(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ặcsocket(AF_INET6, SOCK_DGRAM, IPPROTO_UDPLITE)cho IPv6.sẵn có: Linux >= 2.6.20, FreeBSD >= 10.1
Added in version 3.9.
AF_HYPERVlà 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_idvàservice_idlà các chuỗi UUID.vm_idlà 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ênsocketlà:HV_GUID_ZEROHV_GUID_BROADCASTHV_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.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ồmgethostbyname_ex()và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àmhstrerror()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 đượcgetaddrinfo()và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àmgai_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
TimeoutErrorkhô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ớisettimeout()(hoặc ngầm thông quasetdefaulttimeout()). 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 AddressFamily và SocketKind 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_UNIXkhô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_UNSPECcó 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_STREAMvàSOCK_DGRAMlà 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()và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_KEEPCNTtrê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_KEEPINTVLtrê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êmTCP_KEEPALIVE. Trên MacOS, hằng số này có thể được sử dụng giống như cách sử dụngTCP_KEEPIDLEtrê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ụngTCP_INFOtrên Linux và BSD.Thay đổi trong phiên bản 3.12: Đã thêm
SO_RTABLEvàSO_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ụngSO_MARKtrê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êmIP_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ụngSO_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_RECVTTLvàIP_RECVORIGDSTADDRbị thiếu trên Linux.Thay đổi trong phiên bản 3.14: Đã thêm hỗ trợ cho
TCP_QUICKACKtrê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_FILTERbị 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_FRAMEchỉ 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_ALLcó thể được sử dụng trong hàm tạosocketdướ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.
- 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_ANYcó thể được sử dụng để chỉ ra bất kỳ địa chỉ nào khi chỉ định ổ cắm liên kết bằngBTPROTO_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()vàgetsockopt()của các đối tượng ổ cắm Bluetooth.SOL_BLUETOOTHchỉ 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()vàgetsockopt()của các đối tượng ổ cắm Bluetooth.BT_*vàL2CAP_LMchỉ 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_FILTERvàSO_HCI_PKT_FILTERtrên NetBSD và DragonFly BSD. Đã thêmHCI_DATA_DIRtrê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
channeltrong đị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_PACKEThoặcAF_RDS. Loại ổ cắm phải làSOCK_STREAM(mặc định),SOCK_DGRAM,SOCK_RAWhoặ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_CANthì giao thức phải là một trong cácCAN_RAW,CAN_BCM,CAN_ISOTPhoặcCAN_J1939.Nếu fileno được chỉ định, các giá trị cho family, type và proto 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ằngsocket.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_NONBLOCKhoặcSOCK_CLOEXECđược áp dụng cho type, chúng sẽ bị xóa vàsocket.typesẽ không phản ánh chúng. Chúng vẫn được chuyển đến lệnh gọisocket()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ưngsock.typesẽ được đặt thànhsocket.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_UNIXnế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ơnsocket.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_INETvàAF_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_errors là
Truethì đó làExceptionGroupchứ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_INEThoặcAF_INET6. backlog là kích thước hàng đợi được chuyển tớisocket.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ắmSO_REUSEPORThay không.Nếu dualstack_ipv6 là đúng thì family là
AF_INET6và 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ăngValueError. 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ỉ đượcsocket.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ớihas_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ề
Truenế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àmsocket(). 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.
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
getaddrinfocủ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ặcNone. Bằng cách chuyểnNonelàm giá trị của host và port, bạn có thể chuyểnNULLcho C API cơ bản.Các đối số family, type và proto 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_NUMERICHOSTsẽ 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ếuAI_CANONNAMElà 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)choAF_INET, một bộ 4 bộ(address, port, flowinfo, scope_id)choAF_INET6) và được chuyển cho phương thứcsocket.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_STREAMhoặcSOCK_DGRAM) và/hoặc proto (ví dụ:IPPROTO_TCPhoặcIPPROTO_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, proto và flags 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.getaddrinfovớ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.orgtrê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. Xemgethostbyname_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.gethostbynamevớ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.gethostbynamevớ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.gethostnamemà 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ụnggetfqdn()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àmgetfqdn().gethostbyaddr()hỗ trợ cả IPv4 và IPv6.Tăng một auditing event
socket.gethostbyaddrvớ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.getnameinfovớ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àmsocket(). Đ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.getservbynamevớ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.getservbyportvớ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
OverflowErrornế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
OverflowErrornế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ệ,
OSErrorsẽ đượ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ủainet_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,
OSErrorsẽ đượ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ạiin_addr(tương tựinet_aton()) hoặcin6_addr.Các giá trị được hỗ trợ cho address_family hiện là
AF_INETvàAF_INET6. Nếu chuỗi địa chỉ IP ip_string không hợp lệ,OSErrorsẽ đượ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ủainet_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ạiin_addr(tương tựinet_ntoa()) hoặcin6_addr.Các giá trị được hỗ trợ cho address_family hiện là
AF_INETvàAF_INET6. Nếu đối tượng byte packed_ip không có độ dài chính xác cho họ địa chỉ đã chỉ định,ValueErrorsẽ được nâng lên.OSErrorđược đưa ra do lỗi khi gọi tớiinet_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ụngCMSG_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ăngOverflowErrornế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ăngOverflowErrornế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ị
Nonecho 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. Xemsettimeout()để 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
OSErrornếu bạn không có đủ quyền.Tăng một auditing event
socket.sethostnamevớ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).
OSErrornế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_32770tê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_32770trong 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.
OSErrornế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.
OSErrornế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().
Đố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.bindvớ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ệnhwithxung quanh chúng.Thay đổi trong phiên bản 3.6:
OSErrorhiện được nâng lên nếu xảy ra lỗi khi thực hiện lệnh gọiclose()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ọishutdown()trướcclose().
- 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
TimeoutErrorkhi 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ệInterruptedErrornế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.connectvớ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ệ
InterruptedErrornế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ọiconnect()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à0nếu thao tác thành công, nếu không thì giá trị của biếnerrno. Đ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.connectvớ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:
Truenếu ổ cắm có thể được kế thừa trong các tiến trình con,Falsenế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ề
Truenếu ổ cắm ở chế độ chặn,Falsenế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
Nonenếu không đặt thời gian chờ. Điều này phản ánh lệnh gọi cuối cùng tớisetblocking()hoặcsettimeout().
- 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()và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_VALSvàSIO_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àmopen()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ủasubprocess.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_idnữa. Để có được địa chỉ IPv6 đầy đủ, hãy sử dụnggetnameinfo().
- 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ặcCMSG_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ớirecv().Giá trị trả về là 4 bộ:
(data, ancdata, msg_flags, address). Mục data là đối tượngbyteschứ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_level và cmsg_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ượngbyteschứ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()và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ắmAF_UNIX. Khi tiện ích này được sử dụng (nó thường bị giới hạn ở ổ cắmSOCK_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ượngbytesđạ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ếurecvmsg()đư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 raRuntimeWarningvà 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êmsendmsg().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 và 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ượngbytearray); 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ố ancbufsize và flags có cùng ý nghĩa như đối vớirecvmsg().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_flags và address giống như đối vớirecvmsg().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.sendtovớ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_level và cmsg_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ớisend(). Nếu address được cung cấp chứ không phảiNone, 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êmrecvmsg().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.sendmsgvớ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 socketAF_ALG. Đặt chế độ, IV, độ dài dữ liệu liên quan đến AEAD và cờ cho ổ cắmAF_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.sendfilehiệ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ếuos.sendfilekhô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ạiSOCK_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ớisock.settimeout(None)sock.setblocking(False)tương đương vớisock.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_NONBLOCKtrênsocket.typenữ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ệtimeoutnế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ếuNoneđượ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_NONBLOCKtrênsocket.typenữ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,
Nonehoặ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ọnstructđể biết cách mã hóa cấu trúc C dưới dạng chuỗi byte). Khi value được đặt thànhNone, đối số optlen là bắt buộc. Nó tương đương với việc gọi hàmsetsockopt()C vớioptval=NULLvàoptlen=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 how là
SHUT_RDthì việc nhận thêm sẽ không được phép. Nếu how làSHUT_WR, việc gửi thêm sẽ không được phép. Nếu how làSHUT_RDWR, việc gửi và nhận tiếp theo sẽ không được phép.sẵn có: not WASI.
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() và 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
selectcó 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ó đặc quyền # Arbitrary
với socket.socket(socket.AF_INET, socket.SOCK_STREAM) là 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) là 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 có tên # Symbolic nghĩa là tất cả các giao diện có sẵn
PORT = 50007 cổng không có đặ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 là 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 là 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() và 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.