socket — Low-level networking interface

Quellcode: Lib/socket.py


Dieses Modul bietet Zugriff auf die BSD socket-Schnittstelle. Es ist auf allen modernen Unix-Systemen, Windows, MacOS und wahrscheinlich zusätzlichen Plattformen verfügbar.

Hinweis

Einige Verhaltensweisen können plattformabhängig sein, da Aufrufe an die Socket-APIs des Betriebssystems erfolgen.

Verfügbarkeit: nicht WASI.

Dieses Modul funktioniert nicht oder ist nicht auf WebAssembly verfügbar. Weitere Informationen finden Sie unter WebAssembly-Plattformen.

Die Python-Schnittstelle ist eine einfache Transliteration des Unix-Systemaufrufs und der Bibliotheks-Schnittstelle für Sockets in Pythons objektorientierten Stil: die Funktion socket() gibt ein Socket-Objekt zurück, dessen Methoden die verschiedenen Socket-Systemaufrufe implementieren. Parametertypen sind etwas höher als in der C-Schnittstelle: wie bei den read() und write() Operationen auf Python-Dateien, ist die Pufferallokation bei Empfangsoperationen automatisch, und die Pufferlänge ist bei Sendeoperationen implizit.

Siehe auch

Modul socketserver

Klassen, die das Schreiben von Netzwerkschicht-Servern vereinfachen.

Modul ssl

Ein TLS/SSL-Wrapper für Socket-Objekte.

Socket-Familien

Abhängig vom System und den Build-Optionen werden von diesem Modul verschiedene Socket-Familien unterstützt.

Das Adressformat, das von einem bestimmten Socket-Objekt benötigt wird, wird automatisch basierend auf der bei der Erstellung des Socket-Objekts angegebenen Adressfamilie ausgewählt. Socket-Adressen werden wie folgt dargestellt

  • Die Adresse eines AF_UNIX Sockets, der an einen Dateisystemknoten gebunden ist, wird als String dargestellt, wobei die Dateisystemkodierung und der Fehlerbehandler 'surrogateescape' verwendet werden (siehe PEP 383). Eine Adresse im abstrakten Namensraum von Linux wird als bytes-ähnliches Objekt mit einem führenden Null-Byte zurückgegeben; beachten Sie, dass Sockets in diesem Namensraum mit normalen Dateisystem-Sockets kommunizieren können, sodass Programme, die für die Ausführung unter Linux bestimmt sind, möglicherweise mit beiden Arten von Adressen umgehen müssen. Ein String oder ein bytes-ähnliches Objekt kann für beide Arten von Adressen verwendet werden, wenn sie als Argument übergeben werden.

    Geändert in Version 3.3: Zuvor wurde angenommen, dass AF_UNIX Socket-Pfade die UTF-8-Kodierung verwenden.

    Geändert in Version 3.5: Schreibbare Bytes-ähnliche Objekte werden jetzt akzeptiert.

  • Ein Paar (host, port) wird für die Adressfamilie AF_INET verwendet, wobei host ein String ist, der entweder einen Hostnamen in Internet-Domain-Notation wie 'daring.cwi.nl' oder eine IPv4-Adresse wie '100.50.200.5' darstellt, und port eine Ganzzahl ist.

    • Für IPv4-Adressen werden anstelle einer Host-Adresse zwei Sonderformen akzeptiert: '' steht für INADDR_ANY, was zum Binden an alle Schnittstellen verwendet wird, und der String '<broadcast>' steht für INADDR_BROADCAST. Dieses Verhalten ist nicht mit IPv6 kompatibel, daher sollten Sie diese vermeiden, wenn Sie IPv6 mit Ihren Python-Programmen unterstützen möchten.

  • Für die Adressfamilie AF_INET6 wird ein Vierertupel (host, port, flowinfo, scope_id) verwendet, wobei flowinfo und scope_id die Mitglieder sin6_flowinfo und sin6_scope_id in struct sockaddr_in6 in C darstellen. Für Methoden des Moduls socket können flowinfo und scope_id zur Abwärtskompatibilität weggelassen werden. Beachten Sie jedoch, dass das Weglassen von scope_id Probleme bei der Manipulation von skopierten IPv6-Adressen verursachen kann.

    Geändert in Version 3.7: Für Multicast-Adressen (bei denen scope_id aussagekräftig ist) darf address nicht den Teil %scope_id (oder zone-ID) enthalten. Diese Information ist überflüssig und kann sicher weggelassen werden (empfohlen).

  • AF_NETLINK Sockets werden als Paare (pid, groups) dargestellt.

  • Unter Linux ist die Unterstützung für TIPC über die Adressfamilie AF_TIPC verfügbar. TIPC ist ein offenes, nicht IP-basiertes Netzwerkprotokoll, das für den Einsatz in Clustern von Computersystemen entwickelt wurde. Adressen werden durch ein Tupel dargestellt, und die Felder hängen vom Adresstyp ab. Die allgemeine Tupelform ist (addr_type, v1, v2, v3 [, scope]), wobei

    • addr_type ist einer von TIPC_ADDR_NAMESEQ, TIPC_ADDR_NAME oder TIPC_ADDR_ID.

    • scope ist einer von TIPC_ZONE_SCOPE, TIPC_CLUSTER_SCOPE und TIPC_NODE_SCOPE.

    • Wenn addr_type TIPC_ADDR_NAME ist, dann ist v1 der Servicetyp, v2 der Portidentifikator und v3 sollte 0 sein.

      Wenn addr_type TIPC_ADDR_NAMESEQ ist, dann ist v1 der Servicetyp, v2 die untere Portnummer und v3 die obere Portnummer.

      Wenn addr_type TIPC_ADDR_ID ist, dann ist v1 der Knoten, v2 die Referenz und v3 sollte auf 0 gesetzt werden.

  • Ein Tupel (interface, ) wird für die Adressfamilie AF_CAN verwendet, wobei interface ein String ist, der einen Netzwerkschnittstellennamen wie 'can0' darstellt. Der Netzwerkschnittstellenname '' kann verwendet werden, um Pakete von allen Netzwerkschnittstellen dieser Familie zu empfangen.

    • CAN_ISOTP Protokoll erfordert ein Tupel (interface, rx_addr, tx_addr), wobei beide zusätzlichen Parameter vorzeichenlose Ganzzahlen vom Typ long sind, die eine CAN-ID (Standard oder Erweitert) darstellen.

    • CAN_J1939 Protokoll erfordert ein Tupel (interface, name, pgn, addr), wobei die zusätzlichen Parameter eine vorzeichenlose 64-Bit-Ganzzahl sind, die den ECU-Namen darstellt, eine vorzeichenlose 32-Bit-Ganzzahl, die die Parameter Group Number (PGN) darstellt, und eine 8-Bit-Ganzzahl, die die Adresse darstellt.

  • Ein String oder ein Tupel (id, unit) wird für das SYSPROTO_CONTROL Protokoll der Familie PF_SYSTEM verwendet. Der String ist der Name einer Kernel-Steuerung mit einer dynamisch zugewiesenen ID. Das Tupel kann verwendet werden, wenn die ID und die Nummer der Kernel-Steuerung bekannt sind oder wenn eine registrierte ID verwendet wird.

    Hinzugefügt in Version 3.3.

  • AF_BLUETOOTH unterstützt die folgenden Protokolle und Adressformate

    • BTPROTO_L2CAP akzeptiert ein Tupel (bdaddr, psm[, cid[, bdaddr_type]]), wobei

      • bdaddr ist eine Zeichenkette, die die Bluetooth-Adresse angibt.

      • psm ist eine Ganzzahl, die den Protocol/Service Multiplexer angibt.

      • cid ist eine optionale Ganzzahl, die die Channel Identifier angibt. Wenn sie nicht angegeben ist, wird standardmäßig Null verwendet.

      • bdaddr_type ist eine optionale Ganzzahl, die den Adresstyp angibt; einer von BDADDR_BREDR (Standard), BDADDR_LE_PUBLIC, BDADDR_LE_RANDOM.

      Geändert in Version 3.14: Felder cid und bdaddr_type hinzugefügt.

    • BTPROTO_RFCOMM akzeptiert (bdaddr, channel), wobei bdaddr die Bluetooth-Adresse als String und channel eine Ganzzahl ist.

    • BTPROTO_HCI akzeptiert ein Format, das von Ihrem Betriebssystem abhängt.

      • Unter Linux akzeptiert es eine Ganzzahl device_id oder ein Tupel (device_id, [channel]), wobei device_id die Nummer des Bluetooth-Geräts angibt und channel eine optionale Ganzzahl ist, die den HCI-Kanal angibt (HCI_CHANNEL_RAW als Standard).

      • Unter FreeBSD, NetBSD und DragonFly BSD akzeptiert es bdaddr, wobei bdaddr die Bluetooth-Adresse als String ist.

      Geändert in Version 3.2: Unterstützung für NetBSD und DragonFlyBSD hinzugefügt.

      Geändert in Version 3.13.3: Unterstützung für FreeBSD hinzugefügt.

      Geändert in Version 3.14: Feld channel hinzugefügt. device_id, das nicht in ein Tupel gepackt ist, wird jetzt akzeptiert.

    • BTPROTO_SCO akzeptiert bdaddr, wobei bdaddr die Bluetooth-Adresse als String oder als bytes-Objekt ist. (z.B. '12:23:34:45:56:67' oder b'12:23:34:45:56:67')

      Geändert in Version 3.14: Unterstützung für FreeBSD hinzugefügt.

  • AF_ALG ist eine Linux-spezifische Socket-basierte Schnittstelle zur Kernel-Kryptographie. Ein Algorithmus-Socket wird mit einem Tupel aus zwei bis vier Elementen konfiguriert (type, name [, feat [, mask]]), wobei

    • type ist der Algorithmus-Typ als String, z.B. aead, hash, skcipher oder rng.

    • name ist der Algorithmus-Name und Betriebsmodus als String, z.B. sha256, hmac(sha256), cbc(aes) oder drbg_nopr_ctr_aes256.

    • feat und mask sind vorzeichenlose 32-Bit-Ganzzahlen.

    Verfügbarkeit: Linux >= 2.6.38.

    Einige Algorithmus-Typen erfordern neuere Kernel.

    Hinzugefügt in Version 3.6.

  • AF_VSOCK ermöglicht die Kommunikation zwischen virtuellen Maschinen und ihren Hosts. Die Sockets werden als Tupel (CID, port) dargestellt, wobei die Kontext-ID oder CID und der Port Ganzzahlen sind.

    Verfügbarkeit: Linux >= 3.9

    Siehe vsock(7)

    Hinzugefügt in Version 3.7.

  • AF_PACKET ist eine Low-Level-Schnittstelle direkt zu Netzwerkgeräten. Die Adressen werden durch das Tupel (ifname, proto[, pkttype[, hatype[, addr]]]) dargestellt, wobei

    • ifname - String, der den Gerätenamen angibt.

    • proto - Die Ethernet-Protokollnummer. Kann ETH_P_ALL sein, um alle Protokolle zu erfassen, eine der ETHERTYPE_* Konstanten oder jede andere Ethernet-Protokollnummer.

    • pkttype - Optionale Ganzzahl, die den Pakettyp angibt

      • PACKET_HOST (Standard) - Paket, das an den lokalen Host adressiert ist.

      • PACKET_BROADCAST - Broadcast-Paket auf physikalischer Ebene.

      • PACKET_MULTICAST - Paket, das an eine Multicast-Adresse auf physikalischer Ebene gesendet wird.

      • PACKET_OTHERHOST - Paket an einen anderen Host, das von einem Geräteeintreiber im Promiskuitiven Modus erfasst wurde.

      • PACKET_OUTGOING - Paket, das vom lokalen Host ausgeht und an einen Paket-Socket zurückgeschleift wird.

    • hatype - Optionale Ganzzahl, die den ARP-Hardware-Adresstyp angibt.

    • addr - Optionales bytes-ähnliches Objekt, das die physische Hardware-Adresse angibt, deren Interpretation vom Gerät abhängt.

    Verfügbarkeit: Linux >= 2.2.

  • AF_QIPCRTR ist eine Linux-spezifische Socket-basierte Schnittstelle zur Kommunikation mit Diensten, die auf Coprozessoren auf Qualcomm-Plattformen laufen. Die Adressfamilie wird als Tupel (node, port) dargestellt, wobei node und port nicht-negative Ganzzahlen sind.

    Verfügbarkeit: Linux >= 4.7.

    Hinzugefügt in Version 3.8.

  • IPPROTO_UDPLITE ist eine Variante von UDP, die es Ihnen ermöglicht, anzugeben, welcher Teil eines Pakets vom Checksummen-Schutz abgedeckt wird. Sie fügt zwei Socket-Optionen hinzu, die Sie ändern können. self.setsockopt(IPPROTO_UDPLITE, UDPLITE_SEND_CSCOV, length) ändert, welcher Teil ausgehender Pakete vom Checksummen-Schutz abgedeckt wird, und self.setsockopt(IPPROTO_UDPLITE, UDPLITE_RECV_CSCOV, length) filtert Pakete heraus, die zu wenig ihrer Daten abdecken. In beiden Fällen sollte length im Bereich von range(8, 2**16, 8) liegen.

    Ein solcher Socket sollte mit socket(AF_INET, SOCK_DGRAM, IPPROTO_UDPLITE) für IPv4 oder socket(AF_INET6, SOCK_DGRAM, IPPROTO_UDPLITE) für IPv6 erstellt werden.

    Verfügbarkeit: Linux >= 2.6.20, FreeBSD >= 10.1

    Hinzugefügt in Version 3.9.

  • AF_HYPERV ist eine nur unter Windows verfügbare Socket-basierte Schnittstelle zur Kommunikation mit Hyper-V-Hosts und -Gästen. Die Adressfamilie wird als Tupel (vm_id, service_id) dargestellt, wobei vm_id und service_id UUID-Strings sind.

    Die vm_id ist die virtuelle Maschinenkennung oder eine Menge von bekannten VMID-Werten, wenn das Ziel keine spezifische virtuelle Maschine ist. Bekannte VMID-Konstanten, die in socket definiert sind, sind

    • HV_GUID_ZERO

    • HV_GUID_BROADCAST

    • HV_GUID_WILDCARD - Wird zum Binden an sich selbst und zum Akzeptieren von Verbindungen von allen Partitionen verwendet.

    • HV_GUID_CHILDREN - Wird zum Binden an sich selbst und zum Akzeptieren von Verbindungen von Kindpartitionen verwendet.

    • HV_GUID_LOOPBACK - Wird als Ziel für sich selbst verwendet.

    • HV_GUID_PARENT - Wenn es als Bindung verwendet wird, akzeptiert es Verbindungen von der übergeordneten Partition. Wenn es als Zieladresse verwendet wird, stellt es eine Verbindung zur übergeordneten Partition her.

    Die service_id ist die Kennung des registrierten Dienstes.

    Hinzugefügt in Version 3.12.

Wenn Sie einen Hostnamen im host-Teil einer IPv4/v6-Socket-Adresse verwenden, kann das Programm ein nichtdeterministisches Verhalten zeigen, da Python die erste Adresse verwendet, die von der DNS-Auflösung zurückgegeben wird. Die Socket-Adresse wird je nach den Ergebnissen der DNS-Auflösung und/oder der Hostkonfiguration unterschiedlich in eine tatsächliche IPv4/v6-Adresse aufgelöst. Für deterministisches Verhalten verwenden Sie eine numerische Adresse im host-Teil.

Alle Fehler lösen Ausnahmen aus. Die normalen Ausnahmen für ungültige Argumenttypen und Speicherknappheit können ausgelöst werden. Fehler, die sich auf Socket- oder Adresssemantik beziehen, lösen OSError oder eine seiner Unterklassen aus.

Der nicht-blockierende Modus wird über setblocking() unterstützt. Eine Verallgemeinerung davon, die auf Timeouts basiert, wird über settimeout() unterstützt.

Modulinhalt

Das Modul socket exportiert die folgenden Elemente.

Ausnahmen

exception socket.error

Ein veralteter Alias für OSError.

Geändert in Version 3.3: Gemäß PEP 3151 wurde diese Klasse zu einem Alias von OSError gemacht.

exception socket.herror

Eine Unterklasse von OSError, diese Ausnahme wird für adressbezogene Fehler ausgelöst, d.h. für Funktionen, die h_errno in der POSIX C-API verwenden, einschließlich gethostbyname_ex() und gethostbyaddr(). Der begleitende Wert ist ein Paar (h_errno, string), das einen Fehler darstellt, der von einem Bibliotheksaufruf zurückgegeben wurde. h_errno ist ein numerischer Wert, während string die Beschreibung von h_errno darstellt, wie sie von der C-Funktion hstrerror() zurückgegeben wird.

Geändert in Version 3.3: Diese Klasse wurde zu einer Unterklasse von OSError gemacht.

exception socket.gaierror

Eine Unterklasse von OSError, diese Ausnahme wird für adressbezogene Fehler von getaddrinfo() und getnameinfo() ausgelöst. Der begleitende Wert ist ein Paar (error, string), das einen Fehler darstellt, der von einem Bibliotheksaufruf zurückgegeben wurde. string stellt die Beschreibung von error dar, wie sie von der C-Funktion gai_strerror() zurückgegeben wird. Der numerische error-Wert entspricht einer der in diesem Modul definierten EAI_* Konstanten.

Geändert in Version 3.3: Diese Klasse wurde zu einer Unterklasse von OSError gemacht.

exception socket.timeout

Ein veralteter Alias von TimeoutError.

Eine Unterklasse von OSError, diese Ausnahme wird ausgelöst, wenn ein Timeout bei einem Socket auftritt, bei dem Timeouts über einen vorherigen Aufruf von settimeout() (oder implizit über setdefaulttimeout()) aktiviert wurden. Der begleitende Wert ist ein String, dessen Wert derzeit immer "timed out" ist.

Geändert in Version 3.3: Diese Klasse wurde zu einer Unterklasse von OSError gemacht.

Geändert in Version 3.10: Diese Klasse wurde zu einem Alias von TimeoutError gemacht.

Konstanten

Die AF_* und SOCK_* Konstanten sind jetzt Sammlungen von AddressFamily und SocketKind IntEnum.

Hinzugefügt in Version 3.4.

socket.AF_UNIX
socket.AF_INET
socket.AF_INET6

Diese Konstanten stellen die Adress- (und Protokoll-) Familien dar, die für das erste Argument von socket() verwendet werden. Wenn die Konstante AF_UNIX nicht definiert ist, dann ist dieses Protokoll nicht unterstützt. Je nach System können weitere Konstanten verfügbar sein.

socket.AF_UNSPEC

AF_UNSPEC bedeutet, dass getaddrinfo() Socket-Adressen für jede Adressfamilie (entweder IPv4, IPv6 oder eine beliebige andere) zurückgeben soll, die verwendet werden kann.

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

Diese Konstanten repräsentieren die Socket-Typen, die für das zweite Argument von socket() verwendet werden. Abhängig vom System können weitere Konstanten verfügbar sein. (Nur SOCK_STREAM und SOCK_DGRAM scheinen allgemein nützlich zu sein.)

socket.SOCK_CLOEXEC
socket.SOCK_NONBLOCK

Diese beiden Konstanten, falls definiert, können mit den Socket-Typen kombiniert werden und ermöglichen es Ihnen, einige Flags atomar zu setzen (wodurch mögliche Race Conditions und die Notwendigkeit separater Aufrufe vermieden werden).

Siehe auch

Sichere Behandlung von Dateideskriptoren für eine gründlichere Erklärung.

Verfügbarkeit: Linux >= 2.6.27.

Hinzugefügt in Version 3.2.

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

Viele Konstanten dieser Formen, die in der Unix-Dokumentation zu Sockets und/oder dem IP-Protokoll dokumentiert sind, sind auch im Socket-Modul definiert. Sie werden im Allgemeinen als Argumente für die Methoden setsockopt() und getsockopt() von Socket-Objekten verwendet. In den meisten Fällen sind nur die Symbole definiert, die in den Unix-Header-Dateien definiert sind; für einige Symbole werden Standardwerte bereitgestellt.

Geändert in Version 3.6: SO_DOMAIN, SO_PROTOCOL, SO_PEERSEC, SO_PASSSEC, TCP_USER_TIMEOUT, TCP_CONGESTION wurden hinzugefügt.

Geändert in Version 3.6.5: Unterstützung für TCP_FASTOPEN, TCP_KEEPCNT auf Windows-Plattformen hinzugefügt, sofern verfügbar.

Geändert in Version 3.7: TCP_NOTSENT_LOWAT wurde hinzugefügt.

Unterstützung für TCP_KEEPIDLE, TCP_KEEPINTVL auf Windows-Plattformen hinzugefügt, sofern verfügbar.

Geändert in Version 3.10: IP_RECVTOS wurde hinzugefügt. TCP_KEEPALIVE hinzugefügt. Auf MacOS kann diese Konstante auf die gleiche Weise wie TCP_KEEPIDLE unter Linux verwendet werden.

Geändert in Version 3.11: TCP_CONNECTION_INFO hinzugefügt. Auf MacOS kann diese Konstante auf die gleiche Weise wie TCP_INFO unter Linux und BSD verwendet werden.

Geändert in Version 3.12: SO_RTABLE und SO_USER_COOKIE hinzugefügt. Auf OpenBSD und FreeBSD bzw. können diese Konstanten auf die gleiche Weise wie SO_MARK unter Linux verwendet werden. Ebenfalls fehlende TCP-Socket-Optionen von Linux hinzugefügt: 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. IP_PKTINFO, IP_UNBLOCK_SOURCE, IP_BLOCK_SOURCE, IP_ADD_SOURCE_MEMBERSHIP, IP_DROP_SOURCE_MEMBERSHIP hinzugefügt.

Geändert in Version 3.13: SO_BINDTOIFINDEX hinzugefügt. Unter Linux kann diese Konstante auf die gleiche Weise wie SO_BINDTODEVICE verwendet werden, jedoch mit dem Index einer Netzwerkschnittstelle anstelle ihres Namens.

Geändert in Version 3.14: Fehlende IP_FREEBIND, IP_RECVERR, IPV6_RECVERR, IP_RECVTTL und IP_RECVORIGDSTADDR unter Linux hinzugefügt.

Geändert in Version 3.14: Unterstützung für TCP_QUICKACK auf Windows-Plattformen hinzugefügt, sofern verfügbar.

socket.AF_CAN
socket.PF_CAN
SOL_CAN_*
CAN_*

Viele Konstanten dieser Formen, die in der Linux-Dokumentation dokumentiert sind, sind auch im Socket-Modul definiert.

Verfügbarkeit: Linux >= 2.6.25, NetBSD >= 8.

Hinzugefügt in Version 3.3.

Geändert in Version 3.11: NetBSD-Unterstützung wurde hinzugefügt.

Geändert in Version 3.14: Fehlendes CAN_RAW_ERR_FILTER unter Linux wiederhergestellt.

socket.CAN_BCM
CAN_BCM_*

CAN_BCM ist im CAN-Protokoll-Familie das Broadcast Manager (BCM) Protokoll. Broadcast Manager Konstanten, die in der Linux-Dokumentation dokumentiert sind, sind ebenfalls im Socket-Modul definiert.

Verfügbarkeit: Linux >= 2.6.25.

Hinweis

Das Flag CAN_BCM_CAN_FD_FRAME ist nur unter Linux >= 4.8 verfügbar.

Hinzugefügt in Version 3.4.

socket.CAN_RAW_FD_FRAMES

Aktiviert die CAN FD-Unterstützung in einem CAN_RAW-Socket. Dies ist standardmäßig deaktiviert. Dies ermöglicht es Ihrer Anwendung, sowohl CAN- als auch CAN-FD-Frames zu senden; Sie müssen jedoch beim Lesen vom Socket sowohl CAN- als auch CAN-FD-Frames akzeptieren.

Diese Konstante ist in der Linux-Dokumentation dokumentiert.

Verfügbarkeit: Linux >= 3.6.

Hinzugefügt in Version 3.5.

socket.CAN_RAW_JOIN_FILTERS

Verbindet die angewendeten CAN-Filter so, dass nur CAN-Frames, die allen gegebenen CAN-Filtern entsprechen, an den Userspace weitergegeben werden.

Diese Konstante ist in der Linux-Dokumentation dokumentiert.

Verfügbarkeit: Linux >= 4.1.

Hinzugefügt in Version 3.9.

socket.CAN_ISOTP

CAN_ISOTP ist im CAN-Protokoll-Familie das ISO-TP (ISO 15765-2) Protokoll. ISO-TP Konstanten, dokumentiert in der Linux-Dokumentation.

Verfügbarkeit: Linux >= 2.6.25.

Hinzugefügt in Version 3.7.

socket.CAN_J1939

CAN_J1939 ist im CAN-Protokoll-Familie das SAE J1939 Protokoll. J1939 Konstanten, dokumentiert in der Linux-Dokumentation.

Verfügbarkeit: Linux >= 5.4.

Hinzugefügt in Version 3.9.

socket.AF_DIVERT
socket.PF_DIVERT

Diese beiden Konstanten, die in der FreeBSD divert(4) Manual Page dokumentiert sind, sind ebenfalls im Socket-Modul definiert.

Verfügbarkeit: FreeBSD >= 14.0.

Hinzugefügt in Version 3.12.

socket.AF_PACKET
socket.PF_PACKET
PACKET_*

Viele Konstanten dieser Formen, die in der Linux-Dokumentation dokumentiert sind, sind auch im Socket-Modul definiert.

Verfügbarkeit: Linux >= 2.2.

socket.ETH_P_ALL

ETH_P_ALL kann im socket Konstruktor als *proto* für die AF_PACKET Familie verwendet werden, um jedes Paket unabhängig vom Protokoll abzufangen.

Weitere Informationen finden Sie in der packet(7) Manpage.

Verfügbarkeit: Linux.

Hinzugefügt in Version 3.12.

socket.AF_RDS
socket.PF_RDS
socket.SOL_RDS
RDS_*

Viele Konstanten dieser Formen, die in der Linux-Dokumentation dokumentiert sind, sind auch im Socket-Modul definiert.

Verfügbarkeit: Linux >= 2.6.30.

Hinzugefügt in Version 3.3.

socket.SIO_RCVALL
socket.SIO_KEEPALIVE_VALS
socket.SIO_LOOPBACK_FAST_PATH
RCVALL_*

Konstanten für Windows’ WSAIoctl(). Die Konstanten werden als Argumente für die Methode ioctl() von Socket-Objekten verwendet.

Geändert in Version 3.6: SIO_LOOPBACK_FAST_PATH wurde hinzugefügt.

TIPC_*

TIPC-bezogene Konstanten, die mit denen der C-Socket-API übereinstimmen. Weitere Informationen finden Sie in der TIPC-Dokumentation.

socket.AF_ALG
socket.SOL_ALG
ALG_*

Konstanten für die Kryptographie des Linux-Kernels.

Verfügbarkeit: Linux >= 2.6.38.

Hinzugefügt in Version 3.6.

socket.AF_VSOCK
socket.IOCTL_VM_SOCKETS_GET_LOCAL_CID
VMADDR*
SO_VM*

Konstanten für die Host-/Gastkommunikation unter Linux.

Verfügbarkeit: Linux >= 4.8.

Hinzugefügt in Version 3.7.

Verfügbarkeit: BSD, macOS.

Hinzugefügt in Version 3.4.

socket.has_ipv6

Diese Konstante enthält einen booleschen Wert, der angibt, ob IPv6 auf dieser Plattform unterstützt wird.

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

Ganzzahlige Konstanten zur Verwendung mit Bluetooth-Adressen.

socket.BDADDR_ANY
socket.BDADDR_LOCAL

Dies sind String-Konstanten, die Bluetooth-Adressen mit speziellen Bedeutungen enthalten. Zum Beispiel kann BDADDR_ANY verwendet werden, um jede Adresse anzugeben, wenn der Socket mit BTPROTO_RFCOMM gebunden wird.

socket.BDADDR_BREDR
socket.BDADDR_LE_PUBLIC
socket.BDADDR_LE_RANDOM

Diese Konstanten beschreiben den Typ der Bluetooth-Adresse beim Binden oder Verbinden eines BTPROTO_L2CAP Sockets.

Verfügbarkeit: Linux, FreeBSD

Hinzugefügt in Version 3.14.

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

Wird im Level-Argument für die Methoden setsockopt() und getsockopt() von Bluetooth-Socket-Objekten verwendet.

SOL_BLUETOOTH ist nur unter Linux verfügbar. Andere Konstanten sind verfügbar, wenn das entsprechende Protokoll unterstützt wird.

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

Wird im Optionsnamen- und Wert-Argument für die Methoden setsockopt() und getsockopt() von Bluetooth-Socket-Objekten verwendet.

BT_* und L2CAP_LM sind nur unter Linux verfügbar. SO_BTH_* sind nur unter Windows verfügbar. Andere Konstanten können unter Linux und verschiedenen BSD-Plattformen verfügbar sein.

Hinzugefügt 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

Optionsnamen zur Verwendung mit BTPROTO_HCI. Verfügbarkeit und Format der Optionswerte hängen von der Plattform ab.

Geändert in Version 3.14: SO_HCI_EVT_FILTER und SO_HCI_PKT_FILTER unter NetBSD und DragonFly BSD hinzugefügt. HCI_DATA_DIR unter FreeBSD, NetBSD und DragonFly BSD hinzugefügt.

socket.HCI_DEV_NONE

Der device_id Wert, der zum Erstellen eines HCI-Sockets verwendet wird, der nicht an einen einzelnen Bluetooth-Adapter gebunden ist.

Hinzugefügt in Version 3.14.

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

Mögliche Werte für das Feld channel in der Adresse von BTPROTO_HCI.

Hinzugefügt in Version 3.14.

socket.AF_QIPCRTR

Konstante für Qualcomms IPC Router-Protokoll, das zur Kommunikation mit Remote-Prozessoren verwendet wird, die Dienste anbieten.

Verfügbarkeit: Linux >= 4.7.

socket.SCM_CREDS2
socket.LOCAL_CREDS
socket.LOCAL_CREDS_PERSISTENT

LOCAL_CREDS und LOCAL_CREDS_PERSISTENT können mit SOCK_DGRAM, SOCK_STREAM Sockets verwendet werden, äquivalent zu Linux/DragonFlyBSD SO_PASSCRED, während LOCAL_CREDS die Anmeldeinformationen beim ersten Lesen sendet, LOCAL_CREDS_PERSISTENT für jedes Lesen sendet. SCM_CREDS2 muss dann für letzteres für den Nachrichtentyp verwendet werden.

Hinzugefügt in Version 3.11.

Verfügbarkeit: FreeBSD.

socket.SO_INCOMING_CPU

Konstante zur Optimierung der CPU-Lokalität, die in Verbindung mit SO_REUSEPORT verwendet werden soll.

Hinzugefügt in Version 3.11.

Verfügbarkeit: Linux >= 3.9

socket.SO_REUSEPORT_LB

Konstante zum Aktivieren von doppelten Adress- und Portbindungen mit Lastverteilung.

Hinzugefügt in Version 3.14.

Verfügbarkeit: 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

Konstanten für Windows Hyper-V Sockets für Host-/Gastkommunikation.

Verfügbarkeit: Windows.

Hinzugefügt in Version 3.12.

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

IEEE 802.3-Protokollnummer Konstanten.

Verfügbarkeit: Linux, FreeBSD, macOS.

Hinzugefügt in Version 3.12.

socket.SHUT_RD
socket.SHUT_WR
socket.SHUT_RDWR

Diese Konstanten werden von der Methode shutdown() von Socket-Objekten verwendet.

Verfügbarkeit: nicht WASI.

Funktionen

Erstellung von Sockets

Die folgenden Funktionen erstellen alle Socket-Objekte.

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

Erzeugt einen neuen Socket unter Verwendung der angegebenen Adressfamilie, des Socket-Typs und der Protokollnummer. Die Adressfamilie sollte AF_INET (Standard), AF_INET6, AF_UNIX, AF_CAN, AF_PACKET oder AF_RDS sein. Der Socket-Typ sollte SOCK_STREAM (Standard), SOCK_DGRAM, SOCK_RAW oder möglicherweise eine der anderen SOCK_-Konstanten sein. Die Protokollnummer ist normalerweise Null und kann weggelassen werden, oder im Falle einer Adressfamilie von AF_CAN sollte das Protokoll eine der folgenden sein: CAN_RAW, CAN_BCM, CAN_ISOTP oder CAN_J1939.

Wenn fileno angegeben ist, werden die Werte für family, type und proto aus dem angegebenen File-Deskriptor automatisch ermittelt. Die automatische Ermittlung kann durch Aufruf der Funktion mit expliziten Argumenten family, type oder proto überschrieben werden. Dies wirkt sich nur darauf aus, wie Python z.B. den Rückgabewert von socket.getpeername() darstellt, nicht aber auf die tatsächliche Betriebssystemressource. Im Gegensatz zu socket.fromfd() gibt fileno denselben Socket und nicht eine Kopie zurück. Dies kann helfen, einen getrennten Socket mit socket.close() zu schließen.

Der neu erstellte Socket ist nicht vererbbar.

Löst ein Audit-Ereignis socket.__new__ mit den Argumenten self, family, type, protocol aus.

Geändert in Version 3.3: Die Familie AF_CAN wurde hinzugefügt. Die Familie AF_RDS wurde hinzugefügt.

Geändert in Version 3.4: Das Protokoll CAN_BCM wurde hinzugefügt.

Geändert in Version 3.4: Die zurückgegebenen Sockets sind nun nicht vererbbar.

Geändert in Version 3.7: Das Protokoll CAN_ISOTP wurde hinzugefügt.

Geändert in Version 3.7: Wenn die Bit-Flags SOCK_NONBLOCK oder SOCK_CLOEXEC auf type angewendet werden, werden sie gelöscht, und socket.type spiegelt sie nicht wider. Sie werden dennoch an den zugrunde liegenden Systemaufruf socket() übergeben. Daher,

sock = socket.socket(
    socket.AF_INET,
    socket.SOCK_STREAM | socket.SOCK_NONBLOCK)

erzeugt immer noch einen nicht-blockierenden Socket auf Betriebssystemen, die SOCK_NONBLOCK unterstützen, aber sock.type wird auf socket.SOCK_STREAM gesetzt.

Geändert in Version 3.9: Das Protokoll CAN_J1939 wurde hinzugefügt.

Geändert in Version 3.10: Das Protokoll IPPROTO_MPTCP wurde hinzugefügt.

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

Erstellt ein Paar verbundener Socket-Objekte unter Verwendung der angegebenen Adressfamilie, des Socket-Typs und der Protokollnummer. Adressfamilie, Socket-Typ und Protokollnummer sind wie für die socket()-Funktion oben. Die Standardfamilie ist AF_UNIX, falls auf der Plattform definiert; andernfalls ist die Standardfamilie AF_INET.

Die neu erstellten Sockets sind nicht vererbbar.

Geändert in Version 3.2: Die zurückgegebenen Socket-Objekte unterstützen nun die gesamte Socket-API, anstatt nur einen Teil davon.

Geändert in Version 3.4: Die zurückgegebenen Sockets sind nun nicht vererbbar.

Geändert in Version 3.5: Windows-Unterstützung hinzugefügt.

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

Stellt eine Verbindung zu einem TCP-Dienst her, der unter der address (ein 2-Tupel (host, port)) lauscht, und gibt das Socket-Objekt zurück. Dies ist eine höherwertige Funktion als socket.connect(): Wenn host ein nicht-numerischer Hostname ist, wird versucht, ihn sowohl für AF_INET als auch für AF_INET6 aufzulösen und dann nacheinander zu allen möglichen Adressen zu verbinden, bis eine Verbindung erfolgreich ist. Dies erleichtert das Schreiben von Clients, die mit IPv4 und IPv6 kompatibel sind.

Das Übergeben des optionalen Parameters timeout setzt das Timeout für die Socket-Instanz, bevor versucht wird, eine Verbindung herzustellen. Wenn kein timeout angegeben wird, wird die globale Standard-Timeout-Einstellung verwendet, die von getdefaulttimeout() zurückgegeben wird.

Wenn angegeben, muss source_address ein 2-Tupel (host, port) sein, an das der Socket vor dem Verbinden gebunden werden soll. Wenn Host oder Port leer bzw. 0 sind, wird das Standardverhalten des Betriebssystems verwendet.

Wenn eine Verbindung nicht hergestellt werden kann, wird eine Ausnahme ausgelöst. Standardmäßig ist dies die Ausnahme der letzten Adresse in der Liste. Wenn all_errors True ist, handelt es sich um eine ExceptionGroup, die die Fehler aller Versuche enthält.

Geändert in Version 3.2: source_address wurde hinzugefügt.

Geändert in Version 3.11: all_errors wurde hinzugefügt.

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

Hilfsfunktion, die einen TCP-Socket erstellt, der an address (ein 2-Tupel (host, port)) gebunden ist, und das Socket-Objekt zurückgibt.

family sollte entweder AF_INET oder AF_INET6 sein. backlog ist die Warteschlangengröße, die an socket.listen() übergeben wird; wenn nicht angegeben, wird ein vernünftiger Standardwert gewählt. reuse_port bestimmt, ob die Socket-Option SO_REUSEPORT gesetzt werden soll.

Wenn dualstack_ipv6 wahr ist, family AF_INET6 ist und die Plattform dies unterstützt, kann der Socket sowohl IPv4- als auch IPv6-Verbindungen akzeptieren, andernfalls wird eine ValueError ausgelöst. Die meisten POSIX-Plattformen und Windows sollten diese Funktionalität unterstützen. Wenn diese Funktionalität aktiviert ist, ist die von socket.getpeername() zurückgegebene Adresse bei einer IPv4-Verbindung eine IPv6-Adresse, die als IPv4-mapped IPv6-Adresse dargestellt wird. Wenn dualstack_ipv6 falsch ist, wird diese Funktionalität auf Plattformen, die sie standardmäßig aktivieren (z. B. Linux), explizit deaktiviert. Dieser Parameter kann in Verbindung mit has_dualstack_ipv6() verwendet werden.

import socket

addr = ("", 8080)  # all interfaces, port 8080
if socket.has_dualstack_ipv6():
    s = socket.create_server(addr, family=socket.AF_INET6, dualstack_ipv6=True)
else:
    s = socket.create_server(addr)

Hinweis

Auf POSIX-Plattformen wird die Socket-Option SO_REUSEADDR gesetzt, um vorherige Sockets, die an dieselbe address gebunden waren und sich noch im TIME_WAIT-Status befanden, sofort wiederverwenden zu können.

Hinzugefügt in Version 3.8.

socket.has_dualstack_ipv6()

Gibt True zurück, wenn die Plattform das Erstellen eines TCP-Sockets unterstützt, der sowohl IPv4- als auch IPv6-Verbindungen verarbeiten kann.

Hinzugefügt in Version 3.8.

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

Dupliziert den File-Deskriptor fd (eine Ganzzahl, wie sie von der fileno()-Methode eines Datei-Objekts zurückgegeben wird) und erstellt daraus ein Socket-Objekt. Adressfamilie, Socket-Typ und Protokollnummer sind wie für die socket()-Funktion oben. Der File-Deskriptor sollte sich auf einen Socket beziehen, dies wird jedoch nicht geprüft – nachfolgende Operationen auf dem Objekt können fehlschlagen, wenn der File-Deskriptor ungültig ist. Diese Funktion wird selten benötigt, kann aber verwendet werden, um Socket-Optionen für einen Socket abzurufen oder festzulegen, der als Standardeingabe oder -ausgabe an ein Programm übergeben wird (wie z. B. ein vom Unix inet daemon gestarteter Server). Es wird davon ausgegangen, dass der Socket im Blocking-Modus ist.

Der neu erstellte Socket ist nicht vererbbar.

Geändert in Version 3.4: Die zurückgegebenen Sockets sind nun nicht vererbbar.

socket.fromshare(data)

Instanziiert einen Socket aus Daten, die von der socket.share()-Methode erhalten wurden. Es wird davon ausgegangen, dass der Socket im Blocking-Modus ist.

Verfügbarkeit: Windows.

Hinzugefügt in Version 3.3.

socket.SocketType

Dies ist ein Python-Typobjekt, das den Socket-Objekttyp repräsentiert. Es ist dasselbe wie type(socket(...)).

Andere Funktionen

Das Modul socket bietet auch verschiedene netzwerkbezogene Dienste an

socket.close(fd)

Schließt einen Socket-File-Deskriptor. Dies ist wie os.close(), aber für Sockets. Auf einigen Plattformen (insbesondere Windows) funktioniert os.close() nicht für Socket-File-Deskriptoren.

Hinzugefügt in Version 3.7.

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

Diese Funktion umschließt die C-Funktion getaddrinfo des zugrunde liegenden Systems.

Übersetzt die Argumente host/port in eine Sequenz von 5-Tupeln, die alle notwendigen Argumente für die Erstellung eines Sockets, der mit diesem Dienst verbunden ist, enthalten. host ist ein Domainname, eine String-Darstellung einer IPv4/v6-Adresse oder None. port ist ein String-Dienstname wie 'http', eine numerische Portnummer oder None. Durch Übergabe von None als Wert für host und port können Sie NULL an die zugrunde liegende C-API übergeben.

Die Argumente family, type und proto können optional angegeben werden, um Optionen bereitzustellen und die Liste der zurückgegebenen Adressen einzuschränken. Übergeben Sie ihre Standardwerte (AF_UNSPEC, 0 und 0, bzw.) , um die Ergebnisse nicht einzuschränken. Siehe die folgende Notiz für Details.

Das Argument flags kann eine oder mehrere der AI_*-Konstanten sein und beeinflusst, wie Ergebnisse berechnet und zurückgegeben werden. Zum Beispiel deaktiviert AI_NUMERICHOST die Namensauflösung von Domains und löst einen Fehler aus, wenn host ein Domainname ist.

Die Funktion gibt eine Liste von 5-Tupeln mit der folgenden Struktur zurück:

(family, type, proto, canonname, sockaddr)

In diesen Tupeln sind family, type, proto alles Ganzzahlen und sollen an die socket()-Funktion übergeben werden. canonname ist ein String, der den kanonischen Namen des host darstellt, wenn AI_CANONNAME Teil des flags-Arguments ist; andernfalls ist canonname leer. sockaddr ist ein Tupel, das eine Socket-Adresse beschreibt, deren Format vom zurückgegebenen family abhängt (ein 2-Tupel (address, port) für AF_INET, ein 4-Tupel (address, port, flowinfo, scope_id) für AF_INET6) und an die socket.connect()-Methode übergeben werden soll.

Hinweis

Wenn Sie Ergebnisse von getaddrinfo() zur Erstellung eines Sockets verwenden möchten (anstatt z. B. canonname abzurufen), sollten Sie die Ergebnisse nach type (z. B. SOCK_STREAM oder SOCK_DGRAM) und/oder proto (z. B. IPPROTO_TCP oder IPPROTO_UDP) einschränken, die Ihre Anwendung verarbeiten kann.

Das Verhalten mit Standardwerten für family, type, proto und flags ist systemabhängig.

Viele Systeme (zum Beispiel die meisten Linux-Konfigurationen) geben eine sortierte Liste aller passenden Adressen zurück. Diese Adressen sollten im Allgemeinen nacheinander ausprobiert werden, bis eine Verbindung erfolgreich ist (möglicherweise parallel versucht, z. B. unter Verwendung eines Happy Eyeballs-Algorithmus). In diesen Fällen kann die Einschränkung von type und/oder proto helfen, erfolglose oder unbrauchbare Verbindungsversuche zu eliminieren.

Einige Systeme geben jedoch nur eine einzige Adresse zurück. (Zum Beispiel wurde dies auf Solaris- und AIX-Konfigurationen berichtet.) Auf diesen Systemen hilft die Einschränkung von type und/oder proto sicherzustellen, dass diese Adresse nutzbar ist.

Löst ein Audit-Ereignis socket.getaddrinfo mit den Argumenten host, port, family, type, protocol aus.

Das folgende Beispiel ruft Adressinformationen für eine hypothetische TCP-Verbindung zu example.org auf Port 80 ab (Ergebnisse können auf Ihrem System abweichen, wenn IPv6 nicht aktiviert ist)

>>> 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))]

Geändert in Version 3.2: Parameter können nun mit Schlüsselwortargumenten übergeben werden.

Geändert in Version 3.7: Für IPv6-Multicast-Adressen enthält der String, der eine Adresse repräsentiert, nicht den Teil %scope_id.

socket.getfqdn([name])

Gibt einen vollqualifizierten Domainnamen für name zurück. Wenn name weggelassen oder leer ist, wird er als lokaler Host interpretiert. Um den vollqualifizierten Namen zu ermitteln, wird der von gethostbyaddr() zurückgegebene Hostname geprüft, gefolgt von Aliassen für den Host, falls verfügbar. Der erste Name, der einen Punkt enthält, wird ausgewählt. Wenn kein vollqualifizierter Domainname verfügbar ist und name angegeben wurde, wird er unverändert zurückgegeben. Wenn name leer war oder gleich '0.0.0.0' war, wird der Hostname von gethostname() zurückgegeben.

socket.gethostbyname(hostname)

Übersetzt einen Hostnamen in das IPv4-Adressformat. Die IPv4-Adresse wird als String zurückgegeben, z. B. '100.50.200.5'. Wenn der Hostname selbst eine IPv4-Adresse ist, wird er unverändert zurückgegeben. Siehe gethostbyname_ex() für eine vollständigere Schnittstelle. gethostbyname() unterstützt keine IPv6-Namensauflösung, und getaddrinfo() sollte stattdessen für die IPv4/v6-Dual-Stack-Unterstützung verwendet werden.

Löst ein Audit-Ereignis socket.gethostbyname mit dem Argument hostname aus.

Verfügbarkeit: nicht WASI.

socket.gethostbyname_ex(hostname)

Übersetzt einen Hostnamen in das IPv4-Adressformat, erweiterte Schnittstelle. Gibt ein 3-Tupel (hostname, aliaslist, ipaddrlist) zurück, wobei hostname der primäre Hostname des Hosts ist, aliaslist eine (möglicherweise leere) Liste von alternativen Hostnamen für dieselbe Adresse ist und ipaddrlist eine Liste von IPv4-Adressen für dieselbe Schnittstelle auf demselben Host ist (oft, aber nicht immer eine einzelne Adresse). gethostbyname_ex() unterstützt keine IPv6-Namensauflösung, und getaddrinfo() sollte stattdessen für die IPv4/v6-Dual-Stack-Unterstützung verwendet werden.

Löst ein Audit-Ereignis socket.gethostbyname mit dem Argument hostname aus.

Verfügbarkeit: nicht WASI.

socket.gethostname()

Gibt einen String zurück, der den Hostnamen des Rechners enthält, auf dem der Python-Interpreter gerade ausgeführt wird.

Löst ein Audit-Ereignis socket.gethostname ohne Argumente aus.

Hinweis: gethostname() gibt nicht immer den vollqualifizierten Domainnamen zurück; verwenden Sie stattdessen getfqdn().

Verfügbarkeit: nicht WASI.

socket.gethostbyaddr(ip_address)

Gibt ein 3-Tupel (hostname, aliaslist, ipaddrlist) zurück, wobei hostname der primäre Hostname ist, der auf die gegebene ip_address antwortet, aliaslist eine (möglicherweise leere) Liste von alternativen Hostnamen für dieselbe Adresse ist und ipaddrlist eine Liste von IPv4/v6-Adressen für dieselbe Schnittstelle auf demselben Host ist (wahrscheinlich nur eine einzige Adresse enthaltend). Um den vollqualifizierten Domainnamen zu ermitteln, verwenden Sie die Funktion getfqdn(). gethostbyaddr() unterstützt sowohl IPv4 als auch IPv6.

Löst ein Audit-Ereignis socket.gethostbyaddr mit dem Argument ip_address aus.

Verfügbarkeit: nicht WASI.

socket.getnameinfo(sockaddr, flags)

Übersetzt eine Socket-Adresse sockaddr in ein 2-Tupel (host, port). Abhängig von den Einstellungen von flags kann das Ergebnis einen vollqualifizierten Domainnamen oder eine numerische Adressdarstellung in host enthalten. Ebenso kann port einen String-Portnamen oder eine numerische Portnummer enthalten.

Für IPv6-Adressen wird %scope_id an den Host-Teil angehängt, wenn sockaddr eine aussagekräftige scope_id enthält. Dies geschieht normalerweise bei Multicast-Adressen.

Weitere Informationen zu flags finden Sie in getnameinfo(3).

Löst ein Audit-Ereignis socket.getnameinfo mit dem Argument sockaddr aus.

Verfügbarkeit: nicht WASI.

socket.getprotobyname(protocolname)

Übersetzt einen Internetprotokollnamen (z. B. 'icmp') in eine Konstante, die als (optionales) drittes Argument an die socket()-Funktion übergeben werden kann. Dies ist normalerweise nur für Sockets erforderlich, die im "Raw"-Modus geöffnet sind (SOCK_RAW); für die normalen Socket-Modi wird das richtige Protokoll automatisch gewählt, wenn das Protokoll weggelassen oder Null ist.

Verfügbarkeit: nicht WASI.

socket.getservbyname(servicename[, protocolname])

Übersetzt einen Internetdienstenamen und Protokollnamen in eine Portnummer für diesen Dienst. Der optionale Protokollname sollte, falls angegeben, 'tcp' oder 'udp' sein, andernfalls stimmt jedes Protokoll überein.

Löst ein Auditing-Event socket.getservbyname mit den Argumenten servicename, protocolname aus.

Verfügbarkeit: nicht WASI.

socket.getservbyport(port[, protocolname])

Übersetzt eine Internet-Portnummer und einen Protokollnamen in einen Dienstenamen für diesen Dienst. Der optionale Protokollname sollte, falls angegeben, 'tcp' oder 'udp' sein, andernfalls stimmt jedes Protokoll überein.

Löst ein Auditing-Event socket.getservbyport mit den Argumenten port, protocolname aus.

Verfügbarkeit: nicht WASI.

socket.ntohl(x)

Konvertiert 32-Bit-Ganzzahlen von Netzwerk- zu Host-Byte-Reihenfolge. Auf Rechnern, bei denen die Host-Byte-Reihenfolge mit der Netzwerk-Byte-Reihenfolge übereinstimmt, ist dies eine No-Op; andernfalls wird eine 4-Byte-Swap-Operation durchgeführt.

socket.ntohs(x)

Konvertiert 16-Bit-Ganzzahlen von Netzwerk- zu Host-Byte-Reihenfolge. Auf Rechnern, bei denen die Host-Byte-Reihenfolge mit der Netzwerk-Byte-Reihenfolge übereinstimmt, ist dies eine No-Op; andernfalls wird eine 2-Byte-Swap-Operation durchgeführt.

Geändert in Version 3.10: Löst OverflowError aus, wenn x nicht in einen vorzeichenlosen 16-Bit-Integer passt.

socket.htonl(x)

Konvertiert 32-Bit-Ganzzahlen von Host- zu Netzwerk-Byte-Reihenfolge. Auf Rechnern, bei denen die Host-Byte-Reihenfolge mit der Netzwerk-Byte-Reihenfolge übereinstimmt, ist dies eine No-Op; andernfalls wird eine 4-Byte-Swap-Operation durchgeführt.

socket.htons(x)

Konvertiert 16-Bit-Ganzzahlen von Host- zu Netzwerk-Byte-Reihenfolge. Auf Rechnern, bei denen die Host-Byte-Reihenfolge mit der Netzwerk-Byte-Reihenfolge übereinstimmt, ist dies eine No-Op; andernfalls wird eine 2-Byte-Swap-Operation durchgeführt.

Geändert in Version 3.10: Löst OverflowError aus, wenn x nicht in einen vorzeichenlosen 16-Bit-Integer passt.

socket.inet_aton(ip_string)

Konvertiert eine IPv4-Adresse aus dem Dotted-Quad-Stringformat (z. B. „123.45.67.89“) in ein gepacktes Binärformat mit 32 Bit als Byte-Objekt mit vier Zeichen Länge. Dies ist nützlich bei der Kommunikation mit einem Programm, das die Standard-C-Bibliothek verwendet und Objekte vom Typ in_addr benötigt, was der C-Typ für die gepackten 32-Bit-Binärdaten ist, die diese Funktion zurückgibt.

inet_aton() akzeptiert auch Zeichenketten mit weniger als drei Punkten. Weitere Details finden Sie in der Unix-Handbuchseite inet(3).

Wenn die an diese Funktion übergebene IPv4-Adresszeichenkette ungültig ist, wird eine OSError ausgelöst. Beachten Sie, dass genau das, was gültig ist, von der zugrunde liegenden C-Implementierung von inet_aton() abhängt.

inet_aton() unterstützt kein IPv6, und inet_pton() sollte stattdessen für IPv4/v6-Dual-Stack-Unterstützung verwendet werden.

socket.inet_ntoa(packed_ip)

Konvertiert eine gepackte IPv4-Adresse mit 32 Bit (ein byte-ähnliches Objekt von vier Byte Länge) in ihre standardmäßige Dotted-Quad-Zeichenkettenrepräsentation (z. B. „123.45.67.89“). Dies ist nützlich bei der Kommunikation mit einem Programm, das die Standard-C-Bibliothek verwendet und Objekte vom Typ in_addr benötigt, was der C-Typ für die gepackten 32-Bit-Binärdaten ist, die diese Funktion als Argument entgegennimmt.

Wenn die an diese Funktion übergebene Byte-Sequenz nicht genau 4 Byte lang ist, wird eine OSError ausgelöst. inet_ntoa() unterstützt kein IPv6, und inet_ntop() sollte stattdessen für IPv4/v6-Dual-Stack-Unterstützung verwendet werden.

Geändert in Version 3.5: Schreibbare Bytes-ähnliche Objekte werden jetzt akzeptiert.

socket.inet_pton(address_family, ip_string)

Konvertiert eine IP-Adresse aus ihrem familien-spezifischen Zeichenkettenformat in ein gepacktes Binärformat. inet_pton() ist nützlich, wenn eine Bibliothek oder ein Netzwerkprotokoll ein Objekt vom Typ in_addr (ähnlich wie inet_aton()) oder in6_addr benötigt.

Unterstützte Werte für address_family sind derzeit AF_INET und AF_INET6. Wenn die IP-Adresszeichenkette ip_string ungültig ist, wird eine OSError ausgelöst. Beachten Sie, dass genau das, was gültig ist, sowohl vom Wert von address_family als auch von der zugrunde liegenden Implementierung von inet_pton() abhängt.

Verfügbarkeit: Unix, Windows.

Geändert in Version 3.4: Windows-Unterstützung hinzugefügt

socket.inet_ntop(address_family, packed_ip)

Konvertiert eine gepackte IP-Adresse (ein byte-ähnliches Objekt mit einer bestimmten Anzahl von Bytes) in ihre standardmäßige, familien-spezifische Zeichenkettenrepräsentation (z. B. '7.10.0.5' oder '5aef:2b::8'). inet_ntop() ist nützlich, wenn eine Bibliothek oder ein Netzwerkprotokoll ein Objekt vom Typ in_addr (ähnlich wie inet_ntoa()) oder in6_addr zurückgibt.

Unterstützte Werte für address_family sind derzeit AF_INET und AF_INET6. Wenn das Byte-Objekt packed_ip nicht die richtige Länge für die angegebene Adressfamilie hat, wird eine ValueError ausgelöst. Eine OSError wird bei Fehlern während des Aufrufs von inet_ntop() ausgelöst.

Verfügbarkeit: Unix, Windows.

Geändert in Version 3.4: Windows-Unterstützung hinzugefügt

Geändert in Version 3.5: Schreibbare Bytes-ähnliche Objekte werden jetzt akzeptiert.

socket.CMSG_LEN(length)

Gibt die Gesamtlänge, ohne nachfolgende Auffüllung, eines Ancillary-Datenelements mit zugehörigen Daten der angegebenen length zurück. Dieser Wert kann oft als Puffergröße für recvmsg() verwendet werden, um ein einzelnes Ancillary-Datenelement zu empfangen. **RFC 3542** erfordert jedoch, dass portierbare Anwendungen CMSG_SPACE() verwenden und somit Platz für Auffüllungen einschließen, auch wenn das Element das letzte im Puffer ist. Löst OverflowError aus, wenn length außerhalb des zulässigen Wertebereichs liegt.

Verfügbarkeit: Unix, nicht WASI.

Die meisten Unix-Plattformen.

Hinzugefügt in Version 3.3.

socket.CMSG_SPACE(length)

Gibt die Puffergröße zurück, die für recvmsg() benötigt wird, um ein Ancillary-Datenelement mit zugehörigen Daten der angegebenen length sowie etwaige nachfolgende Auffüllungen zu empfangen. Der für den Empfang mehrerer Elemente benötigte Pufferplatz ist die Summe der CMSG_SPACE()-Werte für ihre jeweiligen Datenlängen. Löst OverflowError aus, wenn length außerhalb des zulässigen Wertebereichs liegt.

Beachten Sie, dass einige Systeme Ancillary-Daten unterstützen, ohne diese Funktion bereitzustellen. Beachten Sie außerdem, dass das Festlegen der Puffergröße mit den Ergebnissen dieser Funktion möglicherweise nicht genau begrenzt, wie viele Ancillary-Daten empfangen werden können, da zusätzliche Daten in den Auffüllungsbereich passen können.

Verfügbarkeit: Unix, nicht WASI.

die meisten Unix-Plattformen.

Hinzugefügt in Version 3.3.

socket.getdefaulttimeout()

Gibt das Standard-Timeout in Sekunden (Float) für neue Socket-Objekte zurück. Ein Wert von None bedeutet, dass neue Socket-Objekte kein Timeout haben. Wenn das Socket-Modul zum ersten Mal importiert wird, ist der Standardwert None.

socket.setdefaulttimeout(timeout)

Legt das Standard-Timeout in Sekunden (Float) für neue Socket-Objekte fest. Wenn das Socket-Modul zum ersten Mal importiert wird, ist der Standardwert None. Weitere Informationen zu möglichen Werten und deren Bedeutung finden Sie unter settimeout().

socket.sethostname(name)

Setzt den Hostnamen des Rechners auf name. Dies löst eine OSError aus, wenn Sie nicht über ausreichende Rechte verfügen.

Löst ein Auditing-Event socket.sethostname mit dem Argument name aus.

Verfügbarkeit: Unix, nicht Android.

Hinzugefügt in Version 3.3.

socket.if_nameindex()

Gibt eine Liste von Netzwerkschnittstelleninformationen (Index-Integer, Namens-String)-Tupel zurück. OSError, wenn der Systemaufruf fehlschlägt.

Verfügbarkeit: Unix, Windows, nicht WASI.

Hinzugefügt in Version 3.3.

Geändert in Version 3.8: Windows-Unterstützung wurde hinzugefügt.

Hinweis

Unter Windows haben Netzwerkschnittstellen in verschiedenen Kontexten unterschiedliche Namen (alle Namen sind Beispiele)

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

  • Name: ethernet_32770

  • Freundlicher Name: vEthernet (nat)

  • Beschreibung: Hyper-V Virtual Ethernet Adapter

Diese Funktion gibt Namen der zweiten Form aus der Liste zurück, in diesem Beispiel ethernet_32770.

socket.if_nametoindex(if_name)

Gibt eine Netzwerkschnittstellen-Indexnummer zurück, die einem Schnittstellennamen entspricht. OSError, wenn keine Schnittstelle mit dem angegebenen Namen existiert.

Verfügbarkeit: Unix, Windows, nicht WASI.

Hinzugefügt in Version 3.3.

Geändert in Version 3.8: Windows-Unterstützung wurde hinzugefügt.

Siehe auch

„Schnittstellenname“ ist ein Name wie in if_nameindex() dokumentiert.

socket.if_indextoname(if_index)

Gibt einen Netzwerkschnittstellennamen zurück, der einer Schnittstellen-Indexnummer entspricht. OSError, wenn keine Schnittstelle mit dem angegebenen Index existiert.

Verfügbarkeit: Unix, Windows, nicht WASI.

Hinzugefügt in Version 3.3.

Geändert in Version 3.8: Windows-Unterstützung wurde hinzugefügt.

Siehe auch

„Schnittstellenname“ ist ein Name wie in if_nameindex() dokumentiert.

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

Sendet die Liste der Dateideskriptoren fds über einen AF_UNIX-Socket sock. Der Parameter fds ist eine Sequenz von Dateideskriptoren. Konsultieren Sie sendmsg() für die Dokumentation dieser Parameter.

Verfügbarkeit: Unix, nicht WASI.

Unix-Plattformen, die sendmsg() und den SCM_RIGHTS-Mechanismus unterstützen.

Hinzugefügt in Version 3.9.

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

Empfängt bis zu maxfds Dateideskriptoren von einem AF_UNIX-Socket sock. Gibt (msg, list(fds), flags, addr) zurück. Konsultieren Sie recvmsg() für die Dokumentation dieser Parameter.

Verfügbarkeit: Unix, nicht WASI.

Unix-Plattformen, die recvmsg() und den SCM_RIGHTS-Mechanismus unterstützen.

Hinzugefügt in Version 3.9.

Hinweis

Etwaige abgeschnittene Ganzzahlen am Ende der Liste der Dateideskriptoren.

Socket-Objekte

Socket-Objekte haben die folgenden Methoden. Mit Ausnahme von makefile() entsprechen diese den Unix-Systemaufrufen, die auf Sockets anwendbar sind.

Geändert in Version 3.2: Unterstützung für das Kontextmanager-Protokoll wurde hinzugefügt. Das Verlassen des Kontextmanagers entspricht dem Aufruf von close().

socket.accept()

Akzeptiert eine Verbindung. Der Socket muss an eine Adresse gebunden und auf Verbindungen warten. Der Rückgabewert ist ein Paar (conn, address), wobei conn ein *neues* Socket-Objekt ist, das zum Senden und Empfangen von Daten über die Verbindung verwendet werden kann, und address die Adresse ist, an die der Socket am anderen Ende der Verbindung gebunden ist.

Der neu erstellte Socket ist nicht vererbbar.

Geändert in Version 3.4: Der Socket ist jetzt nicht erblich.

Geändert in Version 3.5: Wenn der Systemaufruf unterbrochen wird und der Signalhandler keine Ausnahme auslöst, versucht die Methode den Systemaufruf erneut, anstatt eine Ausnahme vom Typ InterruptedError auszulösen (siehe PEP 475 für die Begründung).

socket.bind(address)

Bindet den Socket an die address. Der Socket darf noch nicht gebunden sein. (Das Format von address hängt von der Adressfamilie ab – siehe oben.)

Löst ein Auditing-Event socket.bind mit den Argumenten self, address aus.

Verfügbarkeit: nicht WASI.

socket.close()

Markiert den Socket als geschlossen. Die zugrunde liegende Systemressource (z. B. ein Dateideskriptor) wird ebenfalls geschlossen, wenn alle Dateiobjekte von makefile() geschlossen sind. Sobald dies geschieht, schlagen alle zukünftigen Operationen auf dem Socket-Objekt fehl. Das entfernte Ende empfängt keine weiteren Daten mehr (nachdem die gepufferten Daten geleert wurden).

Sockets werden automatisch geschlossen, wenn sie gesammelt werden, aber es wird empfohlen, sie explizit zu close() oder eine with-Anweisung um sie herum zu verwenden.

Geändert in Version 3.6: Es wird jetzt eine OSError ausgelöst, wenn beim zugrunde liegenden close()-Aufruf ein Fehler auftritt.

Hinweis

close() gibt die mit einer Verbindung verbundenen Ressourcen frei, schließt die Verbindung aber nicht notwendigerweise sofort. Wenn Sie die Verbindung rechtzeitig schließen möchten, rufen Sie shutdown() vor close() auf.

socket.connect(address)

Stellt eine Verbindung zu einem entfernten Socket unter address her. (Das Format von address hängt von der Adressfamilie ab – siehe oben.)

Wenn die Verbindung durch ein Signal unterbrochen wird, wartet die Methode, bis die Verbindung abgeschlossen ist, oder löst einen TimeoutError bei Zeitüberschreitung aus, wenn der Signalhandler keine Ausnahme auslöst und der Socket blockierend ist oder ein Timeout hat. Bei nicht blockierenden Sockets löst die Methode eine Ausnahme vom Typ InterruptedError aus, wenn die Verbindung durch ein Signal unterbrochen wird (oder die vom Signalhandler ausgelöste Ausnahme).

Löst ein Auditing-Event socket.connect mit den Argumenten self, address aus.

Geändert in Version 3.5: Die Methode wartet nun, bis die Verbindung abgeschlossen ist, anstatt eine Ausnahme vom Typ InterruptedError auszulösen, wenn die Verbindung durch ein Signal unterbrochen wird, der Signalhandler keine Ausnahme auslöst und der Socket blockierend ist oder ein Timeout hat (siehe PEP 475 für die Begründung).

Verfügbarkeit: nicht WASI.

socket.connect_ex(address)

Ähnlich wie connect(address), gibt jedoch einen Fehlerindikator zurück, anstatt eine Ausnahme für Fehler auszulösen, die vom C-Level-connect()-Aufruf zurückgegeben werden (andere Probleme, wie z. B. „Host nicht gefunden“, können weiterhin Ausnahmen auslösen). Der Fehlerindikator ist 0, wenn der Vorgang erfolgreich war, andernfalls der Wert der Variablen errno. Dies ist nützlich, um beispielsweise asynchrone Verbindungen zu unterstützen.

Löst ein Auditing-Event socket.connect mit den Argumenten self, address aus.

Verfügbarkeit: nicht WASI.

socket.detach()

Setzt das Socket-Objekt in den geschlossenen Zustand, ohne den zugrunde liegenden Dateideskriptor tatsächlich zu schließen. Der Dateideskriptor wird zurückgegeben und kann für andere Zwecke wiederverwendet werden.

Hinzugefügt in Version 3.2.

socket.dup()

Dupliziert den Socket.

Der neu erstellte Socket ist nicht vererbbar.

Geändert in Version 3.4: Der Socket ist jetzt nicht erblich.

Verfügbarkeit: nicht WASI.

socket.fileno()

Gibt den Dateideskriptor des Sockets zurück (eine kleine Ganzzahl) oder -1 im Fehlerfall. Dies ist nützlich mit select.select().

Unter Windows kann der von dieser Methode zurückgegebene kleine Ganzzahl nicht dort verwendet werden, wo ein Dateideskriptor verwendet werden kann (z. B. os.fdopen()). Unix hat diese Einschränkung nicht.

socket.get_inheritable()

Ruft das vererbbare Flag des Dateideskriptors des Sockets oder des Handles des Sockets ab: True, wenn der Socket in Kindprozessen vererbt werden kann, False, wenn dies nicht möglich ist.

Hinzugefügt in Version 3.4.

socket.getpeername()

Gibt die entfernte Adresse zurück, mit der der Socket verbunden ist. Dies ist beispielsweise nützlich, um die Portnummer eines entfernten IPv4/v6-Sockets herauszufinden. (Das Format der zurückgegebenen Adresse hängt von der Adressfamilie ab – siehe oben.) Auf einigen Systemen wird diese Funktion nicht unterstützt.

socket.getsockname()

Gibt die eigene Adresse des Sockets zurück. Dies ist beispielsweise nützlich, um die Portnummer eines IPv4/v6-Sockets herauszufinden. (Das Format der zurückgegebenen Adresse hängt von der Adressfamilie ab – siehe oben.)

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

Gibt den Wert der gegebenen Socket-Option zurück (siehe die Unix-Manpage getsockopt(2)). Die benötigten symbolischen Konstanten (SO_* etc.) sind in diesem Modul definiert. Wenn buflen fehlt, wird eine Integer-Option angenommen und ihr Integer-Wert wird von der Funktion zurückgegeben. Wenn buflen vorhanden ist, gibt es die maximale Länge des Puffers an, der zum Empfangen der Option verwendet wird, und dieser Puffer wird als Bytes-Objekt zurückgegeben. Es liegt in der Verantwortung des Aufrufers, den Inhalt des Puffers zu dekodieren (siehe das optionale eingebaute Modul struct für eine Möglichkeit, als Byte-Strings kodierte C-Strukturen zu dekodieren).

Verfügbarkeit: nicht WASI.

socket.getblocking()

Gibt True zurück, wenn der Socket im Blocking-Modus ist, False, wenn er sich im Non-Blocking-Modus befindet.

Dies ist äquivalent zur Überprüfung von socket.gettimeout() != 0.

Hinzugefügt in Version 3.7.

socket.gettimeout()

Gibt das Timeout in Sekunden (float), das mit Socket-Operationen verbunden ist, zurück, oder None, wenn kein Timeout gesetzt ist. Dies spiegelt den letzten Aufruf von setblocking() oder settimeout() wider.

socket.ioctl(control, option)

Die Methode ioctl() ist eine eingeschränkte Schnittstelle zur WSAIoctl-Systemschnittstelle. Bitte beachten Sie die Win32-Dokumentation für weitere Informationen.

Auf anderen Plattformen können die generischen Funktionen fcntl.fcntl() und fcntl.ioctl() verwendet werden; sie akzeptieren ein Socket-Objekt als erstes Argument.

Derzeit werden nur die folgenden Steuerungs-Codes unterstützt: SIO_RCVALL, SIO_KEEPALIVE_VALS und SIO_LOOPBACK_FAST_PATH.

Verfügbarkeit: Windows

Geändert in Version 3.6: SIO_LOOPBACK_FAST_PATH wurde hinzugefügt.

socket.listen([backlog])

Ermöglicht es einem Server, Verbindungen zu akzeptieren. Wenn backlog angegeben ist, muss es mindestens 0 sein (wenn es niedriger ist, wird es auf 0 gesetzt); es gibt die Anzahl der nicht akzeptierten Verbindungen an, die das System zulässt, bevor neue Verbindungen abgelehnt werden. Wenn nicht angegeben, wird ein standardmäßig angemessener Wert gewählt.

Verfügbarkeit: nicht WASI.

Geändert in Version 3.5: Der Parameter backlog ist jetzt optional.

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

Gibt ein Datei-Objekt zurück, das mit dem Socket verbunden ist. Der exakte Rückgabetyp hängt von den Argumenten ab, die an makefile() übergeben werden. Diese Argumente werden genauso interpretiert wie von der eingebauten Funktion open(), wobei die einzigen unterstützten mode-Werte 'r' (Standard), 'w', 'b' oder eine Kombination davon sind.

Der Socket muss sich im Blocking-Modus befinden; er kann ein Timeout haben, aber der interne Puffer des Datei-Objekts kann in einem inkonsistenten Zustand landen, wenn ein Timeout auftritt.

Das Schließen des von makefile() zurückgegebenen Datei-Objekts schließt den ursprünglichen Socket nicht, es sei denn, alle anderen Datei-Objekte wurden geschlossen und socket.close() wurde für das Socket-Objekt aufgerufen.

Hinweis

Unter Windows kann das von makefile() erstellte dateiähnliche Objekt nicht dort verwendet werden, wo ein Datei-Objekt mit einem Dateideskriptor erwartet wird, wie z. B. die Stream-Argumente von subprocess.Popen().

socket.recv(bufsize[, flags])

Empfängt Daten vom Socket. Der Rückgabewert ist ein Bytes-Objekt, das die empfangenen Daten darstellt. Die maximale Menge der auf einmal zu empfangenden Daten wird durch bufsize bestimmt. Ein zurückgegebenes leeres Bytes-Objekt zeigt an, dass der Client die Verbindung getrennt hat. Beachten Sie die Unix-Manpage recv(2) für die Bedeutung des optionalen Arguments flags; es hat standardmäßig den Wert Null.

Geändert in Version 3.5: Wenn der Systemaufruf unterbrochen wird und der Signal-Handler keine Ausnahme auslöst, versucht die Methode jetzt, den Systemaufruf erneut zu versuchen, anstatt eine InterruptedError-Ausnahme auszulösen (siehe PEP 475 für die Begründung).

socket.recvfrom(bufsize[, flags])

Empfängt Daten vom Socket. Der Rückgabewert ist ein Paar (bytes, address), wobei bytes ein Bytes-Objekt ist, das die empfangenen Daten darstellt, und address die Adresse des sendenden Sockets ist. Beachten Sie die Unix-Manpage recv(2) für die Bedeutung des optionalen Arguments flags; es hat standardmäßig den Wert Null. (Das Format von address hängt von der Adressfamilie ab – siehe oben.)

Geändert in Version 3.5: Wenn der Systemaufruf unterbrochen wird und der Signal-Handler keine Ausnahme auslöst, versucht die Methode jetzt, den Systemaufruf erneut zu versuchen, anstatt eine InterruptedError-Ausnahme auszulösen (siehe PEP 475 für die Begründung).

Geändert in Version 3.7: Bei Multicast-IPv6-Adressen enthält das erste Element von address nicht mehr den Teil %scope_id. Um die vollständige IPv6-Adresse zu erhalten, verwenden Sie getnameinfo().

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

Empfängt normale Daten (bis zu bufsize Bytes) und zusätzliche Daten vom Socket. Das Argument ancbufsize legt die Größe in Bytes des internen Puffers fest, der zum Empfangen der zusätzlichen Daten verwendet wird; es hat standardmäßig den Wert 0, was bedeutet, dass keine zusätzlichen Daten empfangen werden. Geeignete Puffergrößen für zusätzliche Daten können mit CMSG_SPACE() oder CMSG_LEN() berechnet werden, und Elemente, die nicht in den Puffer passen, können abgeschnitten oder verworfen werden. Das Argument flags hat standardmäßig den Wert 0 und die gleiche Bedeutung wie bei recv().

Der Rückgabewert ist ein 4-Tupel: (data, ancdata, msg_flags, address). Das Element data ist ein bytes-Objekt, das die empfangenen nicht-zusätzlichen Daten enthält. Das Element ancdata ist eine Liste von null oder mehr Tupeln (cmsg_level, cmsg_type, cmsg_data), die die empfangenen zusätzlichen Daten (Kontrollnachrichten) darstellen: cmsg_level und cmsg_type sind ganze Zahlen, die das Protokoll-Level und den Protokoll-spezifischen Typ angeben, und cmsg_data ist ein bytes-Objekt, das die zugehörigen Daten enthält. Das Element msg_flags ist die bitweise OR-Verknüpfung verschiedener Flags, die Bedingungen der empfangenen Nachricht anzeigen; weitere Details finden Sie in Ihrer Systemdokumentation. Wenn der empfangende Socket nicht verbunden ist, ist address die Adresse des sendenden Sockets, falls verfügbar; andernfalls ist sein Wert nicht spezifiziert.

Auf einigen Systemen können sendmsg() und recvmsg() verwendet werden, um Dateideskriptoren zwischen Prozessen über einen AF_UNIX-Socket zu übergeben. Wenn diese Funktion verwendet wird (sie ist oft auf SOCK_STREAM-Sockets beschränkt), gibt recvmsg() in seinen zusätzlichen Daten Elemente der Form (socket.SOL_SOCKET, socket.SCM_RIGHTS, fds) zurück, wobei fds ein bytes-Objekt ist, das die neuen Dateideskriptoren als binäres Array des nativen C int-Typs darstellt. Wenn recvmsg() nach der Rückgabe des Systemaufrufs eine Ausnahme auslöst, wird zuerst versucht, alle über diesen Mechanismus empfangenen Dateideskriptoren zu schließen.

Einige Systeme zeigen die abgeschnittene Länge von zusätzlichen Datenelementen, die nur teilweise empfangen wurden, nicht an. Wenn ein Element über das Ende des Puffers hinauszureichen scheint, gibt recvmsg() eine RuntimeWarning aus und gibt den Teil davon zurück, der sich innerhalb des Puffers befindet, vorausgesetzt, er wurde nicht vor dem Beginn seiner zugehörigen Daten abgeschnitten.

Auf Systemen, die den Mechanismus SCM_RIGHTS unterstützen, empfängt die folgende Funktion bis zu maxfds Dateideskriptoren und gibt die Nachrichtendaten und eine Liste mit den Deskriptoren zurück (wobei unerwartete Bedingungen wie unerwartete Kontrollnachrichten ignoriert werden). Siehe auch sendmsg().

import socket, array

def recv_fds(sock, msglen, maxfds):
    fds = array.array("i")   # Array of ints
    msg, ancdata, flags, addr = sock.recvmsg(msglen, socket.CMSG_LEN(maxfds * fds.itemsize))
    for cmsg_level, cmsg_type, cmsg_data in ancdata:
        if cmsg_level == socket.SOL_SOCKET and cmsg_type == socket.SCM_RIGHTS:
            # Append data, ignoring any truncated integers at the end.
            fds.frombytes(cmsg_data[:len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
    return msg, list(fds)

Verfügbarkeit: Unix.

Die meisten Unix-Plattformen.

Hinzugefügt in Version 3.3.

Geändert in Version 3.5: Wenn der Systemaufruf unterbrochen wird und der Signal-Handler keine Ausnahme auslöst, versucht die Methode jetzt, den Systemaufruf erneut zu versuchen, anstatt eine InterruptedError-Ausnahme auszulösen (siehe PEP 475 für die Begründung).

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

Empfängt normale Daten und zusätzliche Daten vom Socket und verhält sich wie recvmsg(), verteilt die nicht-zusätzlichen Daten aber auf eine Reihe von Puffern, anstatt ein neues Bytes-Objekt zurückzugeben. Das Argument buffers muss ein Iterable von Objekten sein, die schreibbare Puffer exportieren (z. B. bytearray-Objekte); diese werden mit aufeinanderfolgenden Teilen der nicht-zusätzlichen Daten gefüllt, bis alle geschrieben sind oder keine Puffer mehr vorhanden sind. Das Betriebssystem kann die Anzahl der verwendeten Puffer begrenzen (sysconf()-Wert SC_IOV_MAX). Die Argumente ancbufsize und flags haben die gleiche Bedeutung wie bei recvmsg().

Der Rückgabewert ist ein 4-Tupel: (nbytes, ancdata, msg_flags, address), wobei nbytes die Gesamtzahl der Bytes nicht-zusätzlicher Daten ist, die in die Puffer geschrieben wurden, und ancdata, msg_flags und address die gleichen sind wie bei recvmsg().

Beispiel

>>> import socket
>>> s1, s2 = socket.socketpair()
>>> b1 = bytearray(b'----')
>>> b2 = bytearray(b'0123456789')
>>> b3 = bytearray(b'--------------')
>>> s1.send(b'Mary had a little lamb')
22
>>> s2.recvmsg_into([b1, memoryview(b2)[2:9], b3])
(22, [], 0, None)
>>> [b1, b2, b3]
[bytearray(b'Mary'), bytearray(b'01 had a 9'), bytearray(b'little lamb---')]

Verfügbarkeit: Unix.

Die meisten Unix-Plattformen.

Hinzugefügt in Version 3.3.

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

Empfängt Daten vom Socket und schreibt sie in buffer anstatt eine neue Byte-Zeichenkette zu erstellen. Der Rückgabewert ist ein Paar (nbytes, address), wobei nbytes die Anzahl der empfangenen Bytes ist und address die Adresse des sendenden Sockets ist. Beachten Sie die Unix-Manpage recv(2) für die Bedeutung des optionalen Arguments flags; es hat standardmäßig den Wert Null. (Das Format von address hängt von der Adressfamilie ab – siehe oben.)

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

Empfängt bis zu nbytes Bytes vom Socket und speichert die Daten in einem Puffer, anstatt eine neue Byte-Zeichenkette zu erstellen. Wenn nbytes nicht angegeben ist (oder 0), werden bis zur Größe empfangen, die im gegebenen Puffer verfügbar ist. Gibt die Anzahl der empfangenen Bytes zurück. Beachten Sie die Unix-Manpage recv(2) für die Bedeutung des optionalen Arguments flags; es hat standardmäßig den Wert Null.

socket.send(bytes[, flags])

Sendet Daten an den Socket. Der Socket muss mit einem entfernten Socket verbunden sein. Das optionale Argument flags hat die gleiche Bedeutung wie bei recv() oben. Gibt die Anzahl der gesendeten Bytes zurück. Anwendungen sind dafür verantwortlich zu überprüfen, ob alle Daten gesendet wurden; wenn nur ein Teil der Daten übertragen wurde, muss die Anwendung versuchen, die verbleibenden Daten zu senden. Weitere Informationen zu diesem Thema finden Sie im Socket Programming HOWTO.

Geändert in Version 3.5: Wenn der Systemaufruf unterbrochen wird und der Signal-Handler keine Ausnahme auslöst, versucht die Methode jetzt, den Systemaufruf erneut zu versuchen, anstatt eine InterruptedError-Ausnahme auszulösen (siehe PEP 475 für die Begründung).

socket.sendall(bytes[, flags])

Sendet Daten an den Socket. Der Socket muss mit einem entfernten Socket verbunden sein. Das optionale Argument flags hat die gleiche Bedeutung wie bei recv() oben. Im Gegensatz zu send() sendet diese Methode weiterhin Daten aus bytes, bis entweder alle Daten gesendet wurden oder ein Fehler auftritt. Bei Erfolg wird None zurückgegeben. Bei einem Fehler wird eine Ausnahme ausgelöst, und es gibt keine Möglichkeit zu ermitteln, wie viel Daten, falls überhaupt, erfolgreich gesendet wurden.

Geändert in Version 3.5: Das Socket-Timeout wird nicht mehr jedes Mal zurückgesetzt, wenn Daten erfolgreich gesendet werden. Das Socket-Timeout ist nun die maximale Gesamtdauer, um alle Daten zu senden.

Geändert in Version 3.5: Wenn der Systemaufruf unterbrochen wird und der Signal-Handler keine Ausnahme auslöst, versucht die Methode jetzt, den Systemaufruf erneut zu versuchen, anstatt eine InterruptedError-Ausnahme auszulösen (siehe PEP 475 für die Begründung).

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

Sendet Daten an den Socket. Der Socket sollte nicht mit einem entfernten Socket verbunden sein, da der Ziel-Socket durch address angegeben wird. Das optionale Argument flags hat die gleiche Bedeutung wie bei recv() oben. Gibt die Anzahl der gesendeten Bytes zurück. (Das Format von address hängt von der Adressfamilie ab – siehe oben.)

Löst ein Auditing-Ereignis socket.sendto mit den Argumenten self, address aus.

Geändert in Version 3.5: Wenn der Systemaufruf unterbrochen wird und der Signal-Handler keine Ausnahme auslöst, versucht die Methode jetzt, den Systemaufruf erneut zu versuchen, anstatt eine InterruptedError-Ausnahme auszulösen (siehe PEP 475 für die Begründung).

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

Sendet normale und zusätzliche Daten an den Socket, sammelt die nicht-zusätzlichen Daten aus einer Reihe von Puffern und verkettet sie zu einer einzigen Nachricht. Das Argument buffers gibt die nicht-zusätzlichen Daten als Iterable von Bytes-ähnlichen Objekten (z. B. bytes-Objekten) an; das Betriebssystem kann die Anzahl der verwendeten Puffer begrenzen (sysconf()-Wert SC_IOV_MAX). Das Argument ancdata gibt die zusätzlichen Daten (Kontrollnachrichten) als Iterable von null oder mehr Tupeln (cmsg_level, cmsg_type, cmsg_data) an, wobei cmsg_level und cmsg_type ganze Zahlen sind, die das Protokoll-Level und den Protokoll-spezifischen Typ angeben, und cmsg_data ein Bytes-ähnliches Objekt ist, das die zugehörigen Daten enthält. Beachten Sie, dass einige Systeme (insbesondere Systeme ohne CMSG_SPACE()) möglicherweise nur eine Kontrollnachricht pro Aufruf unterstützen. Das Argument flags hat standardmäßig den Wert 0 und die gleiche Bedeutung wie bei send(). Wenn address angegeben und nicht None ist, wird eine Zieladresse für die Nachricht festgelegt. Der Rückgabewert ist die Anzahl der Bytes nicht-zusätzlicher Daten, die gesendet wurden.

Die folgende Funktion sendet die Liste der Dateideskriptoren fds über einen AF_UNIX-Socket auf Systemen, die den Mechanismus SCM_RIGHTS unterstützen. Siehe auch recvmsg().

import socket, array

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

Verfügbarkeit: Unix, nicht WASI.

Die meisten Unix-Plattformen.

Löst ein Auditing-Ereignis socket.sendmsg mit den Argumenten self, address aus.

Hinzugefügt in Version 3.3.

Geändert in Version 3.5: Wenn der Systemaufruf unterbrochen wird und der Signal-Handler keine Ausnahme auslöst, versucht die Methode jetzt, den Systemaufruf erneut zu versuchen, anstatt eine InterruptedError-Ausnahme auszulösen (siehe PEP 475 für die Begründung).

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

Spezialisierte Version von sendmsg() für AF_ALG-Sockets. Legt Modus, IV, AEAD-assoziierte Datenlänge und Flags für AF_ALG-Sockets fest.

Verfügbarkeit: Linux >= 2.6.38.

Hinzugefügt in Version 3.6.

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

Sendet eine Datei bis zum Erreichen des EOF unter Verwendung von Hochleistungs- os.sendfile und gibt die Gesamtzahl der gesendeten Bytes zurück. file muss ein reguläres Datei-Objekt sein, das im Binärmodus geöffnet wurde. Wenn os.sendfile nicht verfügbar ist (z. B. unter Windows) oder file keine reguläre Datei ist, wird stattdessen send() verwendet. offset gibt an, von wo aus die Datei gelesen werden soll. Wenn angegeben, ist count die Gesamtzahl der zu übertragenden Bytes, anstatt die Datei bis zum EOF zu senden. Die Dateiposition wird bei der Rückgabe aktualisiert oder auch im Fehlerfall, in welchem Fall file.tell() verwendet werden kann, um die Anzahl der gesendeten Bytes zu ermitteln. Der Socket muss vom Typ SOCK_STREAM sein. Nicht-blockierende Sockets werden nicht unterstützt.

Hinzugefügt in Version 3.5.

socket.set_inheritable(inheritable)

Setzt das vererbbare Flag des Socket-Dateideskriptors oder des Socket-Handles.

Hinzugefügt in Version 3.4.

socket.setblocking(flag)

Setzt den Socket in den blockierenden oder nicht-blockierenden Modus: Wenn flag falsch ist, wird der Socket auf nicht-blockierend gesetzt, andernfalls auf blockierend.

Diese Methode ist eine Abkürzung für bestimmte settimeout()-Aufrufe

  • sock.setblocking(True) ist äquivalent zu sock.settimeout(None)

  • sock.setblocking(False) ist äquivalent zu sock.settimeout(0.0)

Geändert in Version 3.7: Die Methode wendet das Flag SOCK_NONBLOCK nicht mehr auf socket.type an.

socket.settimeout(value)

Setzt einen Timeout für blockierende Socket-Operationen. Das Argument value kann eine nicht-negative Gleitkommazahl sein, die Sekunden angibt, oder None. Wenn ein Wert ungleich Null angegeben wird, lösen nachfolgende Socket-Operationen eine timeout-Ausnahme aus, wenn die Timeout-Periode value abgelaufen ist, bevor die Operation abgeschlossen wurde. Wenn Null angegeben wird, wird der Socket in den nicht-blockierenden Modus versetzt. Wenn None angegeben wird, wird der Socket in den blockierenden Modus versetzt.

Weitere Informationen finden Sie in den Hinweisen zu Socket-Timeouts.

Geändert in Version 3.7: Die Methode schaltet das Flag SOCK_NONBLOCK nicht mehr auf socket.type um.

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

Setzt den Wert der angegebenen Socket-Option (siehe die Unix-Manpage setsockopt(2)). Die benötigten symbolischen Konstanten sind in diesem Modul definiert (SO_* etc. <socket-unix-constants>). Der Wert kann eine Ganzzahl, None oder ein bytes-ähnliches Objekt sein, das einen Puffer repräsentiert. Im letzteren Fall liegt es am Aufrufer, sicherzustellen, dass die Bytestring die richtigen Bits enthält (siehe das optionale integrierte Modul struct für eine Möglichkeit, C-Strukturen als Bytestrings zu codieren). Wenn value auf None gesetzt ist, ist das Argument optlen erforderlich. Es ist äquivalent zum Aufruf der C-Funktion setsockopt() mit optval=NULL und optlen=optlen.

Geändert in Version 3.5: Schreibbare Bytes-ähnliche Objekte werden jetzt akzeptiert.

Geändert in Version 3.6: Formular setsockopt(level, optname, None, optlen: int) hinzugefügt.

Verfügbarkeit: nicht WASI.

socket.shutdown(how)

Schaltet eine oder beide Hälften der Verbindung ab. Wenn how SHUT_RD ist, sind weitere Empfänge nicht mehr zulässig. Wenn how SHUT_WR ist, sind weitere Sendungen nicht mehr zulässig. Wenn how SHUT_RDWR ist, sind weitere Sendungen und Empfänge nicht mehr zulässig.

Verfügbarkeit: nicht WASI.

socket.share(process_id)

Dupliziert einen Socket und bereitet ihn für die gemeinsame Nutzung mit einem Zielprozess vor. Der Zielprozess muss mit process_id angegeben werden. Das resultierende Byte-Objekt kann dann über eine Form der Interprozesskommunikation an den Zielprozess übergeben werden, und der Socket kann dort mit fromshare() neu erstellt werden. Sobald diese Methode aufgerufen wurde, ist es sicher, den Socket zu schließen, da das Betriebssystem ihn bereits für den Zielprozess dupliziert hat.

Verfügbarkeit: Windows.

Hinzugefügt in Version 3.3.

Beachten Sie, dass es keine Methoden read() oder write() gibt; verwenden Sie stattdessen recv() und send() ohne das Argument flags.

Socket-Objekte haben auch diese (schreibgeschützten) Attribute, die den Werten entsprechen, die dem Konstruktor socket übergeben wurden.

socket.family

Die Socket-Familie.

socket.type

Der Socket-Typ.

socket.proto

Das Socket-Protokoll.

Hinweise zu Socket-Timeouts

Ein Socket-Objekt kann sich in einem von drei Modi befinden: blockierend, nicht-blockierend oder Timeout. Sockets werden standardmäßig immer im blockierenden Modus erstellt, dies kann jedoch durch Aufrufen von setdefaulttimeout() geändert werden.

  • Im blockierenden Modus blockieren Operationen, bis sie abgeschlossen sind oder das System einen Fehler zurückgibt (wie z. B. Verbindungs-Timeout).

  • Im nicht-blockierenden Modus schlagen Operationen fehl (mit einem bedauerlicherweise systemabhängigen Fehler), wenn sie nicht sofort abgeschlossen werden können: Funktionen aus dem Modul select können verwendet werden, um zu wissen, wann und ob ein Socket zum Lesen oder Schreiben verfügbar ist.

  • Im Timeout-Modus schlagen Operationen fehl, wenn sie nicht innerhalb des für den Socket festgelegten Timeouts abgeschlossen werden können (sie lösen eine timeout-Ausnahme aus) oder wenn das System einen Fehler zurückgibt.

Hinweis

Auf Betriebssystemebene werden Sockets im Timeout-Modus intern im nicht-blockierenden Modus gesetzt. Auch die blockierenden und Timeout-Modi werden zwischen Dateideskriptoren und Socket-Objekten, die auf denselben Netzwerkendpunkt verweisen, gemeinsam genutzt. Dieses Implementierungsdetail kann sichtbare Auswirkungen haben, wenn Sie sich z. B. entscheiden, die fileno() eines Sockets zu verwenden.

Timeouts und die Methode connect

Die connect()-Operation unterliegt ebenfalls der Timeout-Einstellung, und es wird im Allgemeinen empfohlen, settimeout() aufzurufen, bevor connect() aufgerufen wird, oder einen Timeout-Parameter an create_connection() zu übergeben. Der System-Netzwerkstapel kann jedoch auch unabhängig von einer Python-Socket-Timeout-Einstellung einen eigenen Verbindungs-Timeout-Fehler zurückgeben.

Timeouts und die Methode accept

Wenn getdefaulttimeout() nicht None ist, erben Sockets, die von der Methode accept() zurückgegeben werden, diesen Timeout. Andernfalls hängt das Verhalten von den Einstellungen des lauschenden Sockets ab

  • wenn der lauschende Socket im blockierenden Modus oder im Timeout-Modus ist, ist der von accept() zurückgegebene Socket im blockierenden Modus;

  • wenn der lauschende Socket im nicht-blockierenden Modus ist, ist es betriebssystemabhängig, ob der von accept() zurückgegebene Socket im blockierenden oder nicht-blockierenden Modus ist. Wenn Sie plattformübergreifendes Verhalten sicherstellen möchten, wird empfohlen, diese Einstellung manuell zu überschreiben.

Beispiel

Hier sind vier minimale Beispielprogramme, die das TCP/IP-Protokoll verwenden: ein Server, der alle empfangenen Daten zurücksendet (der nur einen Client bedient), und ein Client, der ihn verwendet. Beachten Sie, dass ein Server die Sequenz socket(), bind(), listen(), accept() (möglicherweise wiederholtes accept(), um mehr als einen Client zu bedienen) ausführen muss, während ein Client nur die Sequenz socket(), connect() benötigt. Beachten Sie auch, dass der Server nicht sendall()/recv() auf dem Socket ausführt, auf dem er lauscht, sondern auf dem neuen Socket, der von accept() zurückgegeben wird.

Die ersten beiden Beispiele unterstützen nur IPv4.

# Echo server program
import socket

HOST = ''                 # Symbolic name meaning all available interfaces
PORT = 50007              # Arbitrary non-privileged port
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.bind((HOST, PORT))
    s.listen(1)
    conn, addr = s.accept()
    with conn:
        print('Connected by', addr)
        while True:
            data = conn.recv(1024)
            if not data: break
            conn.sendall(data)
# Echo client program
import socket

HOST = 'daring.cwi.nl'    # The remote host
PORT = 50007              # The same port as used by the server
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.connect((HOST, PORT))
    s.sendall(b'Hello, world')
    data = s.recv(1024)
print('Received', repr(data))

Die nächsten beiden Beispiele sind identisch mit den obigen beiden, unterstützen aber sowohl IPv4 als auch IPv6. Die Serverseite lauscht auf die erste verfügbare Adressfamilie (sie sollte stattdessen auf beide lauschen). Auf den meisten IPv6-fähigen Systemen hat IPv6 Vorrang, und der Server akzeptiert möglicherweise keinen IPv4-Verkehr. Die Clientseite versucht, sich mit allen Adressen zu verbinden, die als Ergebnis der Namensauflösung zurückgegeben werden, und sendet Daten an die erste, die erfolgreich verbunden wurde.

# Echo server program
import socket
import sys

HOST = None               # Symbolic name meaning all available interfaces
PORT = 50007              # Arbitrary non-privileged port
s = None
for res in socket.getaddrinfo(HOST, PORT, socket.AF_UNSPEC,
                              socket.SOCK_STREAM, 0, socket.AI_PASSIVE):
    af, socktype, proto, canonname, sa = res
    try:
        s = socket.socket(af, socktype, proto)
    except OSError as msg:
        s = None
        continue
    try:
        s.bind(sa)
        s.listen(1)
    except OSError as msg:
        s.close()
        s = None
        continue
    break
if s is None:
    print('could not open socket')
    sys.exit(1)
conn, addr = s.accept()
with conn:
    print('Connected by', addr)
    while True:
        data = conn.recv(1024)
        if not data: break
        conn.send(data)
# Echo client program
import socket
import sys

HOST = 'daring.cwi.nl'    # The remote host
PORT = 50007              # The same port as used by the server
s = None
for res in socket.getaddrinfo(HOST, PORT, socket.AF_UNSPEC, socket.SOCK_STREAM):
    af, socktype, proto, canonname, sa = res
    try:
        s = socket.socket(af, socktype, proto)
    except OSError as msg:
        s = None
        continue
    try:
        s.connect(sa)
    except OSError as msg:
        s.close()
        s = None
        continue
    break
if s is None:
    print('could not open socket')
    sys.exit(1)
with s:
    s.sendall(b'Hello, world')
    data = s.recv(1024)
print('Received', repr(data))

Das nächste Beispiel zeigt, wie man mit Raw-Sockets unter Windows einen sehr einfachen Netzwerk-Sniffer schreibt. Das Beispiel erfordert Administratorrechte, um die Schnittstelle zu ändern

import socket

# the public network interface
HOST = socket.gethostbyname(socket.gethostname())

# create a raw socket and bind it to the public interface
s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_IP)
s.bind((HOST, 0))

# Include IP headers
s.setsockopt(socket.IPPROTO_IP, socket.IP_HDRINCL, 1)

# receive all packets
s.ioctl(socket.SIO_RCVALL, socket.RCVALL_ON)

# receive a packet
print(s.recvfrom(65565))

# disabled promiscuous mode
s.ioctl(socket.SIO_RCVALL, socket.RCVALL_OFF)

Das nächste Beispiel zeigt, wie die Socket-Schnittstelle zur Kommunikation mit einem CAN-Netzwerk unter Verwendung des Raw-Socket-Protokolls verwendet wird. Um CAN stattdessen mit dem Broadcast-Manager-Protokoll zu verwenden, öffnen Sie einen Socket mit

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

Nachdem der Socket mit (CAN_RAW) gebunden oder mit (CAN_BCM) verbunden wurde, können Sie die Operationen socket.send() und socket.recv() (und ihre Gegenstücke) wie gewohnt auf dem Socket-Objekt verwenden.

Dieses letzte Beispiel erfordert möglicherweise spezielle Berechtigungen

import socket
import struct


# CAN frame packing/unpacking (see 'struct can_frame' in <linux/can.h>)

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

def build_can_frame(can_id, data):
    can_dlc = len(data)
    data = data.ljust(8, b'\x00')
    return struct.pack(can_frame_fmt, can_id, can_dlc, data)

def dissect_can_frame(frame):
    can_id, can_dlc, data = struct.unpack(can_frame_fmt, frame)
    return (can_id, can_dlc, data[:can_dlc])


# create a raw socket and bind it to the 'vcan0' interface
s = socket.socket(socket.AF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
s.bind(('vcan0',))

while True:
    cf, addr = s.recvfrom(can_frame_size)

    print('Received: can_id=%x, can_dlc=%x, data=%s' % dissect_can_frame(cf))

    try:
        s.send(cf)
    except OSError:
        print('Error sending CAN frame')

    try:
        s.send(build_can_frame(0x01, b'\x01\x02\x03'))
    except OSError:
        print('Error sending CAN frame')

Wenn ein Beispiel mehrmals mit zu geringer Verzögerung zwischen den Ausführungen ausgeführt wird, kann dies zu diesem Fehler führen

OSError: [Errno 98] Address already in use

Dies liegt daran, dass die vorherige Ausführung den Socket in einem Zustand TIME_WAIT hinterlassen hat und nicht sofort wiederverwendet werden kann.

Es gibt ein socket-Flag, das gesetzt werden kann, um dies zu verhindern: 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))

Das Flag SO_REUSEADDR weist den Kernel an, einen lokalen Socket im Zustand TIME_WAIT wiederzuverwenden, ohne auf dessen natürliches Timeout zu warten.

Siehe auch

Eine Einführung in die Socket-Programmierung (in C) finden Sie in den folgenden Papieren

  • An Introductory 4.3BSD Interprocess Communication Tutorial, von Stuart Sechrest

  • An Advanced 4.3BSD Interprocess Communication Tutorial, von Samuel J. Leffler et al,

beide im UNIX Programmer’s Manual, Supplementary Documents 1 (Abschnitte PS1:7 und PS1:8). Das plattformspezifische Referenzmaterial für die verschiedenen Socket-bezogenen Systemaufrufe ist ebenfalls eine wertvolle Informationsquelle für die Details der Socket-Semantik. Für Unix siehe die Manpages; für Windows siehe die WinSock (oder Winsock 2) Spezifikation. Für IPv6-fähige APIs sollten Leser RFC 3493 mit dem Titel Basic Socket Interface Extensions for IPv6 konsultieren.