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_UNIXSockets, 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_UNIXSocket-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 AdressfamilieAF_INETverwendet, 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ürINADDR_ANY, was zum Binden an alle Schnittstellen verwendet wird, und der String'<broadcast>'steht fürINADDR_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_INET6wird ein Vierertupel(host, port, flowinfo, scope_id)verwendet, wobei flowinfo und scope_id die Mitgliedersin6_flowinfoundsin6_scope_idinstruct sockaddr_in6in C darstellen. Für Methoden des Modulssocketkö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_NETLINKSockets werden als Paare(pid, groups)dargestellt.Unter Linux ist die Unterstützung für TIPC über die Adressfamilie
AF_TIPCverfü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]), wobeiaddr_type ist einer von
TIPC_ADDR_NAMESEQ,TIPC_ADDR_NAMEoderTIPC_ADDR_ID.scope ist einer von
TIPC_ZONE_SCOPE,TIPC_CLUSTER_SCOPEundTIPC_NODE_SCOPE.Wenn addr_type
TIPC_ADDR_NAMEist, dann ist v1 der Servicetyp, v2 der Portidentifikator und v3 sollte 0 sein.Wenn addr_type
TIPC_ADDR_NAMESEQist, dann ist v1 der Servicetyp, v2 die untere Portnummer und v3 die obere Portnummer.Wenn addr_type
TIPC_ADDR_IDist, dann ist v1 der Knoten, v2 die Referenz und v3 sollte auf 0 gesetzt werden.
Ein Tupel
(interface, )wird für die AdressfamilieAF_CANverwendet, 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_ISOTPProtokoll 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_J1939Protokoll 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 dasSYSPROTO_CONTROLProtokoll der FamiliePF_SYSTEMverwendet. 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_BLUETOOTHunterstützt die folgenden Protokolle und AdressformateBTPROTO_L2CAPakzeptiert ein Tupel(bdaddr, psm[, cid[, bdaddr_type]]), wobeibdaddrist eine Zeichenkette, die die Bluetooth-Adresse angibt.psmist eine Ganzzahl, die den Protocol/Service Multiplexer angibt.cidist eine optionale Ganzzahl, die die Channel Identifier angibt. Wenn sie nicht angegeben ist, wird standardmäßig Null verwendet.bdaddr_typeist eine optionale Ganzzahl, die den Adresstyp angibt; einer vonBDADDR_BREDR(Standard),BDADDR_LE_PUBLIC,BDADDR_LE_RANDOM.
Geändert in Version 3.14: Felder
cidundbdaddr_typehinzugefügt.BTPROTO_RFCOMMakzeptiert(bdaddr, channel), wobeibdaddrdie Bluetooth-Adresse als String undchanneleine Ganzzahl ist.BTPROTO_HCIakzeptiert ein Format, das von Ihrem Betriebssystem abhängt.Unter Linux akzeptiert es eine Ganzzahl
device_idoder ein Tupel(device_id, [channel]), wobeidevice_iddie Nummer des Bluetooth-Geräts angibt undchanneleine optionale Ganzzahl ist, die den HCI-Kanal angibt (HCI_CHANNEL_RAWals Standard).Unter FreeBSD, NetBSD und DragonFly BSD akzeptiert es
bdaddr, wobeibdaddrdie 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
channelhinzugefügt.device_id, das nicht in ein Tupel gepackt ist, wird jetzt akzeptiert.BTPROTO_SCOakzeptiertbdaddr, wobeibdaddrdie Bluetooth-Adresse als String oder alsbytes-Objekt ist. (z.B.'12:23:34:45:56:67'oderb'12:23:34:45:56:67')Geändert in Version 3.14: Unterstützung für FreeBSD hinzugefügt.
AF_ALGist 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]]), wobeitype ist der Algorithmus-Typ als String, z.B.
aead,hash,skcipheroderrng.name ist der Algorithmus-Name und Betriebsmodus als String, z.B.
sha256,hmac(sha256),cbc(aes)oderdrbg_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_VSOCKermö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_PACKETist eine Low-Level-Schnittstelle direkt zu Netzwerkgeräten. Die Adressen werden durch das Tupel(ifname, proto[, pkttype[, hatype[, addr]]])dargestellt, wobeiifname - String, der den Gerätenamen angibt.
proto - Die Ethernet-Protokollnummer. Kann
ETH_P_ALLsein, 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_QIPCRTRist 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_UDPLITEist 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, undself.setsockopt(IPPROTO_UDPLITE, UDPLITE_RECV_CSCOV, length)filtert Pakete heraus, die zu wenig ihrer Daten abdecken. In beiden Fällen solltelengthim Bereich vonrange(8, 2**16, 8)liegen.Ein solcher Socket sollte mit
socket(AF_INET, SOCK_DGRAM, IPPROTO_UDPLITE)für IPv4 odersocket(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_HYPERVist 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, wobeivm_idundservice_idUUID-Strings sind.Die
vm_idist die virtuelle Maschinenkennung oder eine Menge von bekannten VMID-Werten, wenn das Ziel keine spezifische virtuelle Maschine ist. Bekannte VMID-Konstanten, die insocketdefiniert sind, sindHV_GUID_ZEROHV_GUID_BROADCASTHV_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_idist 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.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ßlichgethostbyname_ex()undgethostbyaddr(). 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-Funktionhstrerror()zurückgegeben wird.Geändert in Version 3.3: Diese Klasse wurde zu einer Unterklasse von
OSErrorgemacht.
- exception socket.gaierror¶
Eine Unterklasse von
OSError, diese Ausnahme wird für adressbezogene Fehler vongetaddrinfo()undgetnameinfo()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-Funktiongai_strerror()zurückgegeben wird. Der numerische error-Wert entspricht einer der in diesem Modul definiertenEAI_*Konstanten.Geändert in Version 3.3: Diese Klasse wurde zu einer Unterklasse von
OSErrorgemacht.
- 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 vonsettimeout()(oder implizit übersetdefaulttimeout()) 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
OSErrorgemacht.Geändert in Version 3.10: Diese Klasse wurde zu einem Alias von
TimeoutErrorgemacht.
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 KonstanteAF_UNIXnicht definiert ist, dann ist dieses Protokoll nicht unterstützt. Je nach System können weitere Konstanten verfügbar sein.
- socket.AF_UNSPEC¶
AF_UNSPECbedeutet, dassgetaddrinfo()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. (NurSOCK_STREAMundSOCK_DGRAMscheinen 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()undgetsockopt()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_CONGESTIONwurden hinzugefügt.Geändert in Version 3.6.5: Unterstützung für
TCP_FASTOPEN,TCP_KEEPCNTauf Windows-Plattformen hinzugefügt, sofern verfügbar.Geändert in Version 3.7:
TCP_NOTSENT_LOWATwurde hinzugefügt.Unterstützung für
TCP_KEEPIDLE,TCP_KEEPINTVLauf Windows-Plattformen hinzugefügt, sofern verfügbar.Geändert in Version 3.10:
IP_RECVTOSwurde hinzugefügt.TCP_KEEPALIVEhinzugefügt. Auf MacOS kann diese Konstante auf die gleiche Weise wieTCP_KEEPIDLEunter Linux verwendet werden.Geändert in Version 3.11:
TCP_CONNECTION_INFOhinzugefügt. Auf MacOS kann diese Konstante auf die gleiche Weise wieTCP_INFOunter Linux und BSD verwendet werden.Geändert in Version 3.12:
SO_RTABLEundSO_USER_COOKIEhinzugefügt. Auf OpenBSD und FreeBSD bzw. können diese Konstanten auf die gleiche Weise wieSO_MARKunter 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_MEMBERSHIPhinzugefügt.Geändert in Version 3.13:
SO_BINDTOIFINDEXhinzugefügt. Unter Linux kann diese Konstante auf die gleiche Weise wieSO_BINDTODEVICEverwendet werden, jedoch mit dem Index einer Netzwerkschnittstelle anstelle ihres Namens.Geändert in Version 3.14: Fehlende
IP_FREEBIND,IP_RECVERR,IPV6_RECVERR,IP_RECVTTLundIP_RECVORIGDSTADDRunter Linux hinzugefügt.Geändert in Version 3.14: Unterstützung für
TCP_QUICKACKauf 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_FILTERunter 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_FRAMEist 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_ALLkann imsocketKonstruktor als *proto* für dieAF_PACKETFamilie 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_PATHwurde 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.
- socket.AF_LINK¶
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_ANYverwendet werden, um jede Adresse anzugeben, wenn der Socket mitBTPROTO_RFCOMMgebunden 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_L2CAPSockets.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()undgetsockopt()von Bluetooth-Socket-Objekten verwendet.SOL_BLUETOOTHist 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()undgetsockopt()von Bluetooth-Socket-Objekten verwendet.BT_*undL2CAP_LMsind 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_FILTERundSO_HCI_PKT_FILTERunter NetBSD und DragonFly BSD hinzugefügt.HCI_DATA_DIRunter FreeBSD, NetBSD und DragonFly BSD hinzugefügt.
- socket.HCI_DEV_NONE¶
Der
device_idWert, der zum Erstellen eines HCI-Sockets verwendet wird, der nicht an einen einzelnen Bluetooth-Adapter gebunden ist.Verfügbarkeit: Linux
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
channelin der Adresse vonBTPROTO_HCI.Verfügbarkeit: Linux
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_REUSEPORTverwendet 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_PACKEToderAF_RDSsein. Der Socket-Typ sollteSOCK_STREAM(Standard),SOCK_DGRAM,SOCK_RAWoder möglicherweise eine der anderenSOCK_-Konstanten sein. Die Protokollnummer ist normalerweise Null und kann weggelassen werden, oder im Falle einer Adressfamilie vonAF_CANsollte das Protokoll eine der folgenden sein:CAN_RAW,CAN_BCM,CAN_ISOTPoderCAN_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 zusocket.fromfd()gibt fileno denselben Socket und nicht eine Kopie zurück. Dies kann helfen, einen getrennten Socket mitsocket.close()zu schließen.Der neu erstellte Socket ist nicht vererbbar.
Löst ein Audit-Ereignis
socket.__new__mit den Argumentenself,family,type,protocolaus.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_NONBLOCKoderSOCK_CLOEXECauf type angewendet werden, werden sie gelöscht, undsocket.typespiegelt sie nicht wider. Sie werden dennoch an den zugrunde liegenden Systemaufrufsocket()ü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_NONBLOCKunterstützen, abersock.typewird aufsocket.SOCK_STREAMgesetzt.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 istAF_UNIX, falls auf der Plattform definiert; andernfalls ist die StandardfamilieAF_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 alssocket.connect(): Wenn host ein nicht-numerischer Hostname ist, wird versucht, ihn sowohl fürAF_INETals auch fürAF_INET6aufzulö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
Trueist, handelt es sich um eineExceptionGroup, 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_INEToderAF_INET6sein. backlog ist die Warteschlangengröße, die ansocket.listen()übergeben wird; wenn nicht angegeben, wird ein vernünftiger Standardwert gewählt. reuse_port bestimmt, ob die Socket-OptionSO_REUSEPORTgesetzt werden soll.Wenn dualstack_ipv6 wahr ist, family
AF_INET6ist und die Plattform dies unterstützt, kann der Socket sowohl IPv4- als auch IPv6-Verbindungen akzeptieren, andernfalls wird eineValueErrorausgelöst. Die meisten POSIX-Plattformen und Windows sollten diese Funktionalität unterstützen. Wenn diese Funktionalität aktiviert ist, ist die vonsocket.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 mithas_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_REUSEADDRgesetzt, 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
Truezurü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 diesocket()-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.
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) funktioniertos.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
getaddrinfodes 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 oderNone. Durch Übergabe vonNoneals Wert für host und port können SieNULLan 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 deaktiviertAI_NUMERICHOSTdie 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, wennAI_CANONNAMETeil 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ürAF_INET, ein 4-Tupel(address, port, flowinfo, scope_id)fürAF_INET6) und an diesocket.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_STREAModerSOCK_DGRAM) und/oder proto (z. B.IPPROTO_TCPoderIPPROTO_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.getaddrinfomit den Argumentenhost,port,family,type,protocolaus.Das folgende Beispiel ruft Adressinformationen für eine hypothetische TCP-Verbindung zu
example.orgauf 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 vongethostname()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. Siehegethostbyname_ex()für eine vollständigere Schnittstelle.gethostbyname()unterstützt keine IPv6-Namensauflösung, undgetaddrinfo()sollte stattdessen für die IPv4/v6-Dual-Stack-Unterstützung verwendet werden.Löst ein Audit-Ereignis
socket.gethostbynamemit dem Argumenthostnameaus.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, undgetaddrinfo()sollte stattdessen für die IPv4/v6-Dual-Stack-Unterstützung verwendet werden.Löst ein Audit-Ereignis
socket.gethostbynamemit dem Argumenthostnameaus.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.gethostnameohne Argumente aus.Hinweis:
gethostname()gibt nicht immer den vollqualifizierten Domainnamen zurück; verwenden Sie stattdessengetfqdn().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 Funktiongetfqdn().gethostbyaddr()unterstützt sowohl IPv4 als auch IPv6.Löst ein Audit-Ereignis
socket.gethostbyaddrmit dem Argumentip_addressaus.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_idan 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.getnameinfomit dem Argumentsockaddraus.Verfügbarkeit: nicht WASI.
- socket.getprotobyname(protocolname)¶
Übersetzt einen Internetprotokollnamen (z. B.
'icmp') in eine Konstante, die als (optionales) drittes Argument an diesocket()-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.getservbynamemit den Argumentenservicename,protocolnameaus.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.getservbyportmit den Argumentenport,protocolnameaus.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
OverflowErroraus, 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
OverflowErroraus, 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_addrbenö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
OSErrorausgelöst. Beachten Sie, dass genau das, was gültig ist, von der zugrunde liegenden C-Implementierung voninet_aton()abhängt.inet_aton()unterstützt kein IPv6, undinet_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_addrbenö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
OSErrorausgelöst.inet_ntoa()unterstützt kein IPv6, undinet_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 Typin_addr(ähnlich wieinet_aton()) oderin6_addrbenötigt.Unterstützte Werte für address_family sind derzeit
AF_INETundAF_INET6. Wenn die IP-Adresszeichenkette ip_string ungültig ist, wird eineOSErrorausgelöst. Beachten Sie, dass genau das, was gültig ist, sowohl vom Wert von address_family als auch von der zugrunde liegenden Implementierung voninet_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 Typin_addr(ähnlich wieinet_ntoa()) oderin6_addrzurückgibt.Unterstützte Werte für address_family sind derzeit
AF_INETundAF_INET6. Wenn das Byte-Objekt packed_ip nicht die richtige Länge für die angegebene Adressfamilie hat, wird eineValueErrorausgelöst. EineOSErrorwird bei Fehlern während des Aufrufs voninet_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 AnwendungenCMSG_SPACE()verwenden und somit Platz für Auffüllungen einschließen, auch wenn das Element das letzte im Puffer ist. LöstOverflowErroraus, 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 derCMSG_SPACE()-Werte für ihre jeweiligen Datenlängen. LöstOverflowErroraus, 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
Nonebedeutet, dass neue Socket-Objekte kein Timeout haben. Wenn das Socket-Modul zum ersten Mal importiert wird, ist der StandardwertNone.
- 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 untersettimeout().
- socket.sethostname(name)¶
Setzt den Hostnamen des Rechners auf name. Dies löst eine
OSErroraus, wenn Sie nicht über ausreichende Rechte verfügen.Löst ein Auditing-Event
socket.sethostnamemit dem Argumentnameaus.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_32770Freundlicher 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 Siesendmsg()für die Dokumentation dieser Parameter.Verfügbarkeit: Unix, nicht WASI.
Unix-Plattformen, die
sendmsg()und denSCM_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 Sierecvmsg()für die Dokumentation dieser Parameter.Verfügbarkeit: Unix, nicht WASI.
Unix-Plattformen, die
recvmsg()und denSCM_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
InterruptedErrorauszulö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.bindmit den Argumentenself,addressaus.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 einewith-Anweisung um sie herum zu verwenden.Geändert in Version 3.6: Es wird jetzt eine
OSErrorausgelöst, wenn beim zugrunde liegendenclose()-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 Sieshutdown()vorclose()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
TimeoutErrorbei 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 TypInterruptedErroraus, wenn die Verbindung durch ein Signal unterbrochen wird (oder die vom Signalhandler ausgelöste Ausnahme).Löst ein Auditing-Event
socket.connectmit den Argumentenself,addressaus.Geändert in Version 3.5: Die Methode wartet nun, bis die Verbindung abgeschlossen ist, anstatt eine Ausnahme vom Typ
InterruptedErrorauszulö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 ist0, wenn der Vorgang erfolgreich war, andernfalls der Wert der Variablenerrno. Dies ist nützlich, um beispielsweise asynchrone Verbindungen zu unterstützen.Löst ein Auditing-Event
socket.connectmit den Argumentenself,addressaus.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
structfür eine Möglichkeit, als Byte-Strings kodierte C-Strukturen zu dekodieren).Verfügbarkeit: nicht WASI.
- socket.getblocking()¶
Gibt
Truezurü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 vonsetblocking()odersettimeout()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()undfcntl.ioctl()verwendet werden; sie akzeptieren ein Socket-Objekt als erstes Argument.Derzeit werden nur die folgenden Steuerungs-Codes unterstützt:
SIO_RCVALL,SIO_KEEPALIVE_VALSundSIO_LOOPBACK_FAST_PATH.Verfügbarkeit: Windows
Geändert in Version 3.6:
SIO_LOOPBACK_FAST_PATHwurde 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 Funktionopen(), 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 undsocket.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 vonsubprocess.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 Siegetnameinfo().
- 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()oderCMSG_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 beirecv().Der Rückgabewert ist ein 4-Tupel:
(data, ancdata, msg_flags, address). Das Element data ist einbytes-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 einbytes-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()undrecvmsg()verwendet werden, um Dateideskriptoren zwischen Prozessen über einenAF_UNIX-Socket zu übergeben. Wenn diese Funktion verwendet wird (sie ist oft aufSOCK_STREAM-Sockets beschränkt), gibtrecvmsg()in seinen zusätzlichen Daten Elemente der Form(socket.SOL_SOCKET, socket.SCM_RIGHTS, fds)zurück, wobei fds einbytes-Objekt ist, das die neuen Dateideskriptoren als binäres Array des nativen C int-Typs darstellt. Wennrecvmsg()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()eineRuntimeWarningaus 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_RIGHTSunterstü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 auchsendmsg().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()-WertSC_IOV_MAX). Die Argumente ancbufsize und flags haben die gleiche Bedeutung wie beirecvmsg().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 beirecvmsg().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 zusend()sendet diese Methode weiterhin Daten aus bytes, bis entweder alle Daten gesendet wurden oder ein Fehler auftritt. Bei Erfolg wirdNonezurü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.sendtomit den Argumentenself,addressaus.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()-WertSC_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 ohneCMSG_SPACE()) möglicherweise nur eine Kontrollnachricht pro Aufruf unterstützen. Das Argument flags hat standardmäßig den Wert 0 und die gleiche Bedeutung wie beisend(). Wenn address angegeben und nichtNoneist, 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 MechanismusSCM_RIGHTSunterstützen. Siehe auchrecvmsg().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.sendmsgmit den Argumentenself,addressaus.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ürAF_ALG-Sockets. Legt Modus, IV, AEAD-assoziierte Datenlänge und Flags fürAF_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.sendfileund gibt die Gesamtzahl der gesendeten Bytes zurück. file muss ein reguläres Datei-Objekt sein, das im Binärmodus geöffnet wurde. Wennos.sendfilenicht verfügbar ist (z. B. unter Windows) oder file keine reguläre Datei ist, wird stattdessensend()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 Fallfile.tell()verwendet werden kann, um die Anzahl der gesendeten Bytes zu ermitteln. Der Socket muss vom TypSOCK_STREAMsein. 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()-Aufrufesock.setblocking(True)ist äquivalent zusock.settimeout(None)sock.setblocking(False)ist äquivalent zusock.settimeout(0.0)
Geändert in Version 3.7: Die Methode wendet das Flag
SOCK_NONBLOCKnicht mehr aufsocket.typean.
- 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 einetimeout-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. WennNoneangegeben 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_NONBLOCKnicht mehr aufsocket.typeum.
- 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,
Noneoder 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 Modulstructfür eine Möglichkeit, C-Strukturen als Bytestrings zu codieren). Wenn value aufNonegesetzt ist, ist das Argument optlen erforderlich. Es ist äquivalent zum Aufruf der C-Funktionsetsockopt()mitoptval=NULLundoptlen=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_RDist, sind weitere Empfänge nicht mehr zulässig. Wenn howSHUT_WRist, sind weitere Sendungen nicht mehr zulässig. Wenn howSHUT_RDWRist, sind weitere Sendungen und Empfänge nicht mehr zulässig.Verfügbarkeit: nicht WASI.
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
selectkö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.