socket

Π‘Π΅Ρ‚Π΅Π²ΠΎΠΉ интСрфСйс Π½ΠΈΠ·ΠΊΠΎΠ³ΠΎ уровня

Π­Ρ‚ΠΎΡ‚ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ обСспСчиваСт доступ ΠΊ интСрфСйсу сокСта socket BSD. Он доступСн Π²ΠΎ всСх соврСмСнных систСмах Unix, Windows, MacOS ΠΈ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π½Π° Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ°Ρ….

НСкотороС ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°Π²ΠΈΡΠ΅Ρ‚ΡŒ ΠΎΡ‚ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡ‹, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ Π²Ρ‹Π·ΠΎΠ²Ρ‹ API сокСтов ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмы.

Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡ Python прСдставляСт собой ΠΏΡ€ΡΠΌΡƒΡŽ Ρ‚Ρ€Π°Π½ΡΠ»ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΡŽ систСмного Π²Ρ‹Π·ΠΎΠ²Π° Unix ΠΈ интСрфСйса Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ для сокСтов Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΡΡ‚ΠΈΠ»ΡŒ Python: функция socket () Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ сокСта, ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‚ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ систСмныС Π²Ρ‹Π·ΠΎΠ²Ρ‹ сокСтов. Π’ΠΈΠΏΡ‹ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² нСсколько Π±ΠΎΠ»Π΅Π΅ высокоуровнСвыС, Ρ‡Π΅ΠΌ Π² интСрфСйсС C: ΠΊΠ°ΠΊ ΠΈ Π² случаС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ чтСния () ΠΈ записи () с Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ Python, распрСдСлСниС Π±ΡƒΡ„Π΅Ρ€Π° ΠΏΡ€ΠΈ опСрациях ΠΏΡ€ΠΈΠ΅ΠΌΠ° происходит автоматичСски, Π° Π΄Π»ΠΈΠ½Π° Π±ΡƒΡ„Π΅Ρ€Π° нСявна ΠΏΡ€ΠΈ опСрациях ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ.

Π’ зависимости ΠΎΡ‚ систСмы ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² сборки этот ΠΌΠΎΠ΄ΡƒΠ»ΡŒ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ сСмСйства сокСтов.

Π€ΠΎΡ€ΠΌΠ°Ρ‚ адрСса, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ΠΉ для ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° сокСта, выбираСтся автоматичСски Π½Π° основС сСмСйства адрСсов, ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΡ€ΠΈ создании ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° сокСта. АдрСса сокСтов прСдставлСны ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

  • AF_UNIX - сокСты для мСТпроцСссного взаимодСйствия UNIX-машин

  • AF_INET - сокСты сСтСвого ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π° IPv4

  • AF_INET6 - сокСты сСтСвого ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π° IPv6

  • AF_NETLINK - сокСты для ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΌΠ΅ΠΆΠ΄Ρƒ ядром систСмы ΠΈ процСссами

  • AF_TIPC - сокСты TIPC, ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π°, Π½Π΅ основанного Π½Π° IP (кластСрная срСда)

  • AF_CAN - сокСты ΠΏΡ€ΠΎΠΌΡ‹ΡˆΠ»Π΅Π½Π½ΠΎΠΉ сСти CAN

  • PF_SYSTEM - сокСты для ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΌΠ΅ΠΆΠ΄Ρƒ ядром систСмы ΠΈ процСссами

  • AF_BLUETOOTH - сокСты для ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ Π² сСти Bluetooth

  • AF_ALG - интСрфСйс сокСтов Π² Linux для ΠΊΡ€ΠΈΠΏΡ‚ΠΎΠ³Ρ€Π°Ρ„ΠΈΠΈ ядра

  • AF_VSOCK - сокСты для связи Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… машин с ΠΈΡ… хостами

  • AF_PACKET - Π½ΠΈΠ·ΠΊΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²Ρ‹ΠΉ интСрфСйс нСпосрСдствСнно для сСтСвых устройств

  • AF_QIPCRTR - интСрфСйс сокСтов для сопроцСссоров Qualcomm Π² Linux

  • IPPROTO_UDPLITE - Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ UDP с ΡƒΠΊΠ°Π·Π°Π½ΠΈΠ΅ΠΌ какая Ρ‡Π°ΡΡ‚ΡŒ покрываСтся ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½ΠΎΠΉ суммой

Если Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ имя хоста Π² части хоста адрСса сокСта IPv4/v6, ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Π½Π΅Π΄Π΅Ρ‚Π΅Ρ€ΠΌΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Python ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ адрСс, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½Π½Ρ‹ΠΉ ΠΈΠ· Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ DNS. АдрСс сокСта Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎ-Ρ€Π°Π·Π½ΠΎΠΌΡƒ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ Π² фактичСский адрСс IPv4/v6, Π² зависимости ΠΎΡ‚ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ DNS ΠΈ/ΠΈΠ»ΠΈ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ хоста. Для Π΄Π΅Ρ‚Π΅Ρ€ΠΌΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ повСдСния ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ числовой адрСс Π² части хоста.

ВсС ошибки Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ. ΠœΠΎΠ³ΡƒΡ‚ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Ρ‚ΡŒ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Π΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ для нСдопустимых Ρ‚ΠΈΠΏΠΎΠ² Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΈ условий Π½Π΅Ρ…Π²Π°Ρ‚ΠΊΠΈ памяти; начиная с Python 3.3, ошибки, связанныС с сСмантикой сокСта ΠΈΠ»ΠΈ адрСса, Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚ OSError ΠΈΠ»ΠΈ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Π΅Π³ΠΎ подклассов (ΠΎΠ½ΠΈ использовались для ΠΏΠΎΠ²Ρ‹ΡˆΠ΅Π½ΠΈΡ socket.error).

ΠΠ΅Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ Ρ€Π΅ΠΆΠΈΠΌ поддСрТиваСтся Ρ‡Π΅Ρ€Π΅Π· setblocking (). ΠžΠ±ΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅ этого Π½Π° основС Ρ‚Π°ΠΉΠΌ-Π°ΡƒΡ‚ΠΎΠ² поддСрТиваСтся Ρ‡Π΅Ρ€Π΅Π· settimeout ().

Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠΈΠΌΠΎΠ΅ модуля

ΠœΠΎΠ΄ΡƒΠ»ΡŒ socket экспортируСт ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ элСмСнты.

  • socket.error exception - ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΠΈΠΉ псСвдоним OSError

  • socket.herror exception

  • socket.gaierror exception

  • socket.timeout exception - ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚, ΠΊΠΎΠ³Π΄Π° Ρ‚Π°ΠΉΠΌ-Π°ΡƒΡ‚ происходит Π² сокСтС

  • socket.AF_UNIX

  • socket.AF_INET

  • socket.AF_INET6

  • socket.SOCK_STREAM

  • Π½Π΅ Π·Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΎ...

  • socket.CAN_BCM

  • Π½Π΅ Π·Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΎ...

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ сокСтов

ВсС ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΡΠΎΠ·Π΄Π°ΡŽΡ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ сокСтов.

  • socket.socket () - создаСт Π½ΠΎΠ²Ρ‹ΠΉ сокСт

  • socket.socketpair ()

  • socket.create_connection ()

  • socket.create_server ()

  • socket.has_dualstack_ipv6 ()

  • socket.fromfd ()

  • socket.fromshare ()

  • socket.SocketType

Π”Ρ€ΡƒΠ³ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ

ΠœΠΎΠ΄ΡƒΠ»ΡŒ socket Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ сСтСвыС услуги:

  • socket.close () - Π·Π°ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ дСскриптор Ρ„Π°ΠΉΠ»Π° сокСта

  • socket.getaddrinfo () - ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ Π² ΠΊΠΎΡ€Ρ‚Π΅ΠΆ с Π΄Π°Π½Π½Ρ‹ΠΌΠΈ для создания сокСта

  • socket.getfqdn () - Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΏΠΎΠ»Π½ΠΎΠ΅ Π΄ΠΎΠΌΠ΅Π½Π½ΠΎΠ΅ имя

  • socket.gethostbyname () - ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ имя хоста Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ адрСса IPv4

  • socket.gethostbyname_ex () - ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ имя хоста Π² Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½Π½Ρ‹ΠΉ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ адрСса IPv4

  • socket.gethostname () - Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ строку с ΠΈΠΌΠ΅Π½Π΅ΠΌ хоста, Π³Π΄Π΅ выполняСтся Python

  • socket.gethostbyaddr () - ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ адрСс Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° IPv4/v6 Π² Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½Π½ΠΎΠ΅ имя хоста

  • socket.getnameinfo () - ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ адрСс сокСта Π² ΠΊΠΎΡ€Ρ‚Π΅ΠΆ хост/ΠΏΠΎΡ€Ρ‚

  • socket.getprotobyname () - ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ имя ΠΈΠ½Ρ‚Π΅Ρ€Π½Π΅Ρ‚-ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π° Π² константу для socket()

  • socket.getservbyname () - ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ имя ΠΈΠ½Ρ‚Π΅Ρ€Π½Π΅Ρ‚-слуТбы ΠΈ имя ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π° Π² Π½ΠΎΠΌΠ΅Ρ€ ΠΏΠΎΡ€Ρ‚Π°

  • socket.getservbyport () - ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ Π½ΠΎΠΌΠ΅Ρ€ ΠΈΠ½Ρ‚Π΅Ρ€Π½Π΅Ρ‚-ΠΏΠΎΡ€Ρ‚Π° ΠΈ имя ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π° Π² имя слуТбы

  • socket.ntohl () - ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ 32-Π±ΠΈΡ‚Π½Ρ‹Π΅ Ρ†Π΅Π»Ρ‹Π΅ числа ΠΈΠ· сСти Π² порядок Π±Π°ΠΉΡ‚ΠΎΠ² хоста

  • socket.ntohs ()

  • socket.htonl () - ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ 32-Π±ΠΈΡ‚Π½Ρ‹Π΅ Ρ†Π΅Π»Ρ‹Π΅ числа ΠΈΠ· хоста Π² сСтСвой порядок Π±Π°ΠΉΡ‚ΠΎΠ²

  • socket.htons ()

  • socket.inet_aton ()

  • socket.inet_ntoa ()

  • socket.inet_pton ()

  • socket.inet_ntop ()

  • socket.CMSG_LEN ()

  • socket.CMSG_SPACE ()

  • socket.getdeafulttimeout ()

  • socket.setdefaulttimeout ()

  • socket.sethostname ()

  • socket.if_nameindex ()

  • socket.if_nametoindex ()

  • socket.if_indextoname ()

Π£ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² socket Π΅ΡΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹. Π—Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ makefile (), ΠΎΠ½ΠΈ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‚ систСмным Π²Ρ‹Π·ΠΎΠ²Π°ΠΌ Unix, ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌΡ‹ΠΌ ΠΊ сокСтам.

ИзмСнСно Π² вСрсии 3.2: Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π° диспСтчСра контСкста. Π’Ρ‹Ρ…ΠΎΠ΄ ΠΈΠ· диспСтчСра контСкста эквивалСнтСн Π²Ρ‹Π·ΠΎΠ²Ρƒ close ().

  • socket.accept () - ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ соСдинСниС

  • socket.bind () - привязываСт сокСт ΠΊ адрСсу

  • socket.close () - ΠΏΠΎΠΌΠ΅Ρ‡Π°Π΅Ρ‚ сокСт Π·Π°ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΌ

  • socket.connect () - ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ ΠΊ ΡƒΠ΄Π°Π»Π΅Π½Π½ΠΎΠΌΡƒ сокСту ΠΏΠΎ Π·Π°Π΄Π°Π½Π½ΠΎΠΌΡƒ адрСсу

  • socket.connect_ex ()

  • socket.detach ()

  • socket.dup ()

  • socket.fileno ()

  • socket.get_inheritable ()

  • socket.getpeername ()

  • socket.getsockname ()

  • socket.getsockopt ()

  • socket.getblocking ()

  • socket.gettimeout ()

  • socket.ioctl ()

  • socket.listen () - Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π΅Ρ‚ сСрвСру ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ Π·Π°Π΄Π°Π½Π½ΠΎΠ΅ количСство соСдинСний

  • socket.makefile () - Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Ρ„Π°ΠΉΠ»Π°, связанный с сокСтом

  • socket.recv () - ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Π΄Π°Π½Π½Ρ‹Π΅ ΠΈΠ· сокСта

  • socket.recvfrom ()

  • socket.recvmsg ()

  • socket.recvmsg_into ()

  • socket.recvfrom_into ()

  • socket.recv_into ()

  • socket.send () - отправляСт Π΄Π°Π½Π½Ρ‹Π΅ Π² сокСт

  • socket.sendall () - отправляСт всС Π΄Π°Π½Π½Ρ‹Π΅ Π² сокСт ΠΏΡ€ΠΈΠ½ΡƒΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ

  • socket.sendto ()

  • socket.sendmsg ()

  • socket.sendmsg_afalg ()

  • socket.send_fds ()

  • socket.recv_fds ()

  • socket.sendfile ()

  • socket.set_inheritable ()

  • socket.setblocking () - устанавливаСт Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ ΠΈΠ»ΠΈ Π½Π΅Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ Ρ€Π΅ΠΆΠΈΠΌ сокСта

  • socket.settimeout () - устанавливаСт Ρ‚Π°ΠΉΠΌ-Π°ΡƒΡ‚ для Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ сокСта

  • socket.setsockopt ()

  • socket.shutdown ()

  • socket.share ()

  • socket.family

  • socket.type

  • socket.proto

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΡ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Ρ‚Π°ΠΉΠΌ-Π°ΡƒΡ‚ΠΎΠ² сокСтов

ΠžΠ±ΡŠΠ΅ΠΊΡ‚ сокСта ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΈΠ· Ρ‚Ρ€Π΅Ρ… Ρ€Π΅ΠΆΠΈΠΌΠΎΠ²: Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ, Π½Π΅Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ ΠΈΠ»ΠΈ Ρ‚Π°ΠΉΠΌ-Π°ΡƒΡ‚. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ сокСты всСгда ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ, Π½ΠΎ это ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ, Π²Ρ‹Π·Π²Π°Π² setdefaulttimeout ().

  • Π’ Ρ€Π΅ΠΆΠΈΠΌΠ΅ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ blocking mode ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‚ΡΡ Π΄ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ ΠΈΠ»ΠΈ систСма Π½Π΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΎΡˆΠΈΠ±ΠΊΡƒ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, истСкло врСмя оТидания соСдинСния).

  • Π’ Π½Π΅Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‰Π΅ΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅ non-blocking mode ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ°ΡŽΡ‚ΡΡ Π½Π΅ΡƒΠ΄Π°Ρ‡Π½ΠΎ (с ошибкой, которая, ΠΊ соТалСнию, зависит ΠΎΡ‚ систСмы), Ссли ΠΎΠ½ΠΈ Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Ρ‹ Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ: Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈΠ· модуля select ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ·Π½Π°Ρ‚ΡŒ, ΠΊΠΎΠ³Π΄Π° ΠΈ доступСн Π»ΠΈ сокСт для чтСния ΠΈΠ»ΠΈ записи.

  • Π’ Ρ€Π΅ΠΆΠΈΠΌΠ΅ Ρ‚Π°ΠΉΠΌ-Π°ΡƒΡ‚Π° timeout mode ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ°ΡŽΡ‚ΡΡ ошибкой, Ссли ΠΎΠ½ΠΈ Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½Ρ‹ Π² Ρ‚Π΅Ρ‡Π΅Π½ΠΈΠ΅ Ρ‚Π°ΠΉΠΌ-Π°ΡƒΡ‚Π°, ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ для сокСта (ΠΎΠ½ΠΈ Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Ρ‚Π°ΠΉΠΌ-Π°ΡƒΡ‚Π° timeout exception) ΠΈΠ»ΠΈ Ссли систСма Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΎΡˆΠΈΠ±ΠΊΡƒ.

На ΡƒΡ€ΠΎΠ²Π½Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмы сокСты Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ Ρ‚Π°ΠΉΠΌ-Π°ΡƒΡ‚Π° Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°ΡŽΡ‚ΡΡ Π² Π½Π΅Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ Ρ€Π΅ΠΆΠΈΠΌ. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Ρ€Π΅ΠΆΠΈΠΌΡ‹ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ ΠΈ Ρ‚Π°ΠΉΠΌ-Π°ΡƒΡ‚Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ совмСстно дСскрипторами Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ сокСтов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ относятся ΠΊ ΠΎΠ΄Π½ΠΎΠΉ ΠΈ Ρ‚ΠΎΠΉ ΠΆΠ΅ ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΉ Ρ‚ΠΎΡ‡ΠΊΠ΅ сСти. Π­Ρ‚Π° Π΄Π΅Ρ‚Π°Π»ΡŒ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Π²ΠΈΠ΄ΠΈΠΌΡ‹Π΅ послСдствия, Ссли, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π²Ρ‹ Ρ€Π΅ΡˆΠΈΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ fileno () сокСта.

Π’Π°ΠΉΠΌ-Π°ΡƒΡ‚Ρ‹ ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ connect

ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΡ connect () Ρ‚Π°ΠΊΠΆΠ΅ зависит ΠΎΡ‚ установки Ρ‚Π°ΠΉΠΌ-Π°ΡƒΡ‚Π°, ΠΈ Π² Ρ†Π΅Π»ΠΎΠΌ рСкомСндуСтся Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ settimeout () ΠΏΠ΅Ρ€Π΅Π΄ Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ connect () ΠΈΠ»ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Ρ‚Π°ΠΉΠΌ-Π°ΡƒΡ‚Π° Π² create_connection (). Однако систСмный сСтСвой стСк ΠΌΠΎΠΆΠ΅Ρ‚ Ρ‚Π°ΠΊΠΆΠ΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ ΡΠΎΠ±ΡΡ‚Π²Π΅Π½Π½ΡƒΡŽ ΠΎΡˆΠΈΠ±ΠΊΡƒ Ρ‚Π°ΠΉΠΌ-Π°ΡƒΡ‚Π° соСдинСния нСзависимо ΠΎΡ‚ любого ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° Ρ‚Π°ΠΉΠΌ-Π°ΡƒΡ‚Π° сокСта Python.

Π’Π°ΠΉΠΌ-Π°ΡƒΡ‚Ρ‹ ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ accept

Если getdefaulttimeout () Π½Π΅ Ρ€Π°Π²Π½ΠΎ None, сокСты, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ accept (), Π½Π°ΡΠ»Π΅Π΄ΡƒΡŽΡ‚ этот Ρ‚Π°ΠΉΠΌ-Π°ΡƒΡ‚. Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ зависит ΠΎΡ‚ настроСк ΠΏΡ€ΠΎΡΠ»ΡƒΡˆΠΈΠ²Π°ΡŽΡ‰Π΅Π³ΠΎ сокСта:

  • Ссли ΠΏΡ€ΠΎΡΠ»ΡƒΡˆΠΈΠ²Π°ΡŽΡ‰ΠΈΠΉ сокСт находится Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ blocking mode ΠΈΠ»ΠΈ Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ Ρ‚Π°ΠΉΠΌ-Π°ΡƒΡ‚Π° timeout mode, сокСт, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ accept (), находится Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ blocking mode;

  • Ссли ΠΏΡ€ΠΎΡΠ»ΡƒΡˆΠΈΠ²Π°ΡŽΡ‰ΠΈΠΉ сокСт находится Π² Π½Π΅Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‰Π΅ΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅ non-blocking mode, Ρ‚ΠΎ, находится Π»ΠΈ сокСт, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹ΠΉ accept (), Π² Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‰Π΅ΠΌ ΠΈΠ»ΠΈ Π½Π΅Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‰Π΅ΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅, зависит ΠΎΡ‚ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмы. Если Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ кросс-ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ΅Π½Π½ΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅, рСкомСндуСтся Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ этот ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹

Π’ΠΎΡ‚ Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΡ… ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» TCP/IP: сСрвСр, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅Ρ‚ всС Π΄Π°Π½Π½Ρ‹Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ½ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ (обслуТивая Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°), ΠΈ ΠΊΠ»ΠΈΠ΅Π½Ρ‚, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠΉ Π΅Π³ΠΎ. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ сСрвСр Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ socket (), bind (), listen (), accept () (Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, повторяя accept () для обслуТивания Π±ΠΎΠ»Π΅Π΅ Ρ‡Π΅ΠΌ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°), Π² Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρƒ трСбуСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ socket (), connect (). Π’Π°ΠΊΠΆΠ΅ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ сСрвСр Π½Π΅ выполняСт sendall () / recv () Π½Π° сокСтС, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΠ½ ΠΏΡ€ΠΎΡΠ»ΡƒΡˆΠΈΠ²Π°Π΅Ρ‚, Π° Π½Π° Π½ΠΎΠ²ΠΎΠΌ сокСтС, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠΌ accept ().

ΠŸΠ΅Ρ€Π²Ρ‹Π΅ Π΄Π²Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ IPv4.

# ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° эхо-сСрвСра
import socket

HOST = ''                 # БимволичСскоС имя, ΠΎΠ·Π½Π°Ρ‡Π°ΡŽΡ‰Π΅Π΅ всС доступныС интСрфСйсы
PORT = 50007              # ΠŸΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹ΠΉ Π½Π΅ΠΏΡ€ΠΈΠ²ΠΈΠ»Π΅Π³ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΠΏΠΎΡ€Ρ‚
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)
# ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° эхо-ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°
import socket

HOST = 'daring.cwi.nl'    # Π£Π΄Π°Π»Π΅Π½Π½Ρ‹ΠΉ хост
PORT = 50007              # Π’ΠΎΡ‚ ΠΆΠ΅ ΠΏΠΎΡ€Ρ‚, Ρ‡Ρ‚ΠΎ ΠΈ сСрвСр
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))

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Π΄Π²Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½Ρ‹ Π΄Π²ΡƒΠΌ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΌ Π²Ρ‹ΡˆΠ΅, Π½ΠΎ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ ΠΊΠ°ΠΊ IPv4, Ρ‚Π°ΠΊ ΠΈ IPv6. Π‘Ρ‚ΠΎΡ€ΠΎΠ½Π° сСрвСра Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΡΠ»ΡƒΡˆΠΈΠ²Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π²ΠΎΠ΅ доступноС сСмСйство адрСсов (вмСсто этого ΠΎΠ½Π° Π΄ΠΎΠ»ΠΆΠ½Π° ΡΠ»ΡƒΡˆΠ°Ρ‚ΡŒ ΠΎΠ±Π°). Π’ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ систСм, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‰ΠΈΡ… IPv6, IPv6 Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚, ΠΈ сСрвСр ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π΅ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ Ρ‚Ρ€Π°Ρ„ΠΈΠΊ IPv4. ΠšΠ»ΠΈΠ΅Π½Ρ‚ΡΠΊΠ°Ρ сторона попытаСтся ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒΡΡ ΠΊΠΎ всСм адрСсам, ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΌ Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΈΠΌΠ΅Π½, ΠΈ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ Ρ‚Ρ€Π°Ρ„ΠΈΠΊ Π½Π° ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½Π½Ρ‹ΠΉ.

# ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° эхо-сСрвСра
import socket
import sys

HOST = None               # БимволичСскоС имя, ΠΎΠ·Π½Π°Ρ‡Π°ΡŽΡ‰Π΅Π΅ всС доступныС интСрфСйсы
PORT = 50007              # ΠŸΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹ΠΉ Π½Π΅ΠΏΡ€ΠΈΠ²ΠΈΠ»Π΅Π³ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΠΏΠΎΡ€Ρ‚
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)
# ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° эхо-ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°
import socket
import sys

HOST = 'daring.cwi.nl'    # Π£Π΄Π°Π»Π΅Π½Π½Ρ‹ΠΉ хост
PORT = 50007              # Π’ΠΎΡ‚ ΠΆΠ΅ ΠΏΠΎΡ€Ρ‚, Ρ‡Ρ‚ΠΎ ΠΈ сСрвСр
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))

Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ, ΠΊΠ°ΠΊ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΎΡ‡Π΅Π½ΡŒ простой сСтСвой сниффСр с Π½Π΅ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½Π½Ρ‹ΠΌΠΈ сокСтами Π² Windows. Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ΡΡ ΠΏΡ€Π°Π²Π° администратора для измСнСния интСрфСйса:

import socket

# ΠΏΡƒΠ±Π»ΠΈΡ‡Π½Ρ‹ΠΉ сСтСвой интСрфСйс
HOST = socket.gethostbyname(socket.gethostname())

# ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π½Π΅ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½Π½Ρ‹ΠΉ сокСт ΠΈ ΠΏΡ€ΠΈΠ²ΡΠ·Π°Ρ‚ΡŒ Π΅Π³ΠΎ ΠΊ общСдоступному интСрфСйсу
s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_IP)
s.bind((HOST, 0))

# Π’ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΈ IP
s.setsockopt(socket.IPPROTO_IP, socket.IP_HDRINCL, 1)

# ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ всС ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹
s.ioctl(socket.SIO_RCVALL, socket.RCVALL_ON)

# ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΏΠ°ΠΊΠ΅Ρ‚
print(s.recvfrom(65565))

# ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½ бСспорядочный Ρ€Π΅ΠΆΠΈΠΌ
s.ioctl(socket.SIO_RCVALL, socket.RCVALL_OFF)

Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ, ΠΊΠ°ΠΊ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ интСрфСйс сокСта для связи с ΡΠ΅Ρ‚ΡŒΡŽ CAN с использованиСм ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π° сырых сокСтов. Π§Ρ‚ΠΎΠ±Ρ‹ вмСсто этого ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ CAN с ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»ΠΎΠΌ диспСтчСра вСщания, ΠΎΡ‚ΠΊΡ€ΠΎΠΉΡ‚Π΅ сокСт с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ:

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

ПослС привязки (CAN_RAW) ΠΈΠ»ΠΈ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ (CAN_BCM) сокСта Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ socket.send () ΠΈ socket.recv () (ΠΈ ΠΈΡ… Π°Π½Π°Π»ΠΎΠ³ΠΈ) для ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° сокСта ΠΊΠ°ΠΊ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ.

Π’ этом послСднСм ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Ρ‚ΡŒΡΡ особыС ΠΏΡ€ΠΈΠ²ΠΈΠ»Π΅Π³ΠΈΠΈ:

import socket
import struct


# Π£ΠΏΠ°ΠΊΠΎΠ²ΠΊΠ°/распаковка CAN-Ρ„Ρ€Π΅ΠΉΠΌΠΎΠ² (см. 'Struct can_frame' Π² <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])


# ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π½Π΅ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½Π½Ρ‹ΠΉ сокСт ΠΈ ΠΏΡ€ΠΈΠ²ΡΠ·Π°Ρ‚ΡŒ Π΅Π³ΠΎ ΠΊ интСрфСйсу 'vcan0'
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')

Π’Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° нСсколько Ρ€Π°Π· со слишком ΠΌΠ°Π»ΠΎΠΉ Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠΎΠΉ ΠΌΠ΅ΠΆΠ΄Ρƒ выполнСниями ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ этой ошибкС:

OSError: [Errno 98] Address already in use

Π­Ρ‚ΠΎ связано с Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ оставило сокСт Π² состоянии TIME_WAIT ΠΈ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ использовано ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ.

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ это, Π½ΡƒΠΆΠ½ΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Ρ„Π»Π°Π³ сокСта 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))

Ρ„Π»Π°Π³ SO_REUSEADDR ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ ядру ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ сокСт Π² состоянии TIME_WAIT, Π½Π΅ доТидаясь истСчСния Π΅Π³ΠΎ СстСствСнного Ρ‚Π°ΠΉΠΌ-Π°ΡƒΡ‚Π°.

Π‘ΠΌ.Ρ‚Π°ΠΊΠΆΠ΅: Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ сокСтов (Π½Π° C) ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… ΡΡ‚Π°Ρ‚ΡŒΡΡ…:

  • Π’Π²ΠΎΠ΄Π½ΠΎΠ΅ руководство ΠΏΠΎ мСТпроцСссному Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΠΈΡŽ 4.3BSD ΠΎΡ‚ Π‘Ρ‚ΡŽΠ°Ρ€Ρ‚Π° БСчрСста

  • Π Π°ΡΡˆΠΈΡ€Π΅Π½Π½Ρ‹ΠΉ ΡƒΡ‡Π΅Π±Π½ΠΈΠΊ ΠΏΠΎ мСТпроцСссному Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΠΈΡŽ 4.3BSD, Бэмюэл Π”ΠΆ. Π›Π΅Ρ„Ρ„Π»Π΅Ρ€ ΠΈ Π΄Ρ€.

ΠΎΠ±Π° Π² РуководствС программиста UNIX, Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Ρ‹ 1 (Ρ€Π°Π·Π΄Π΅Π»Ρ‹ PS1: 7 ΠΈ PS1: 8). Π‘ΠΏΡ€Π°Π²ΠΎΡ‡Π½Ρ‹Π΅ ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»Ρ‹, относящиСся ΠΊ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΉ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ΅, ΠΏΠΎ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌ систСмным Π²Ρ‹Π·ΠΎΠ²Π°ΠΌ, связанным с сокСтами, Ρ‚Π°ΠΊΠΆΠ΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ Ρ†Π΅Π½Π½Ρ‹ΠΌ источником ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎ дСталях сСмантики сокСтов. Для Unix см. Π‘ΠΏΡ€Π°Π²ΠΎΡ‡Π½Ρ‹Π΅ страницы; для Windows см. ΡΠΏΠ΅Ρ†ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡŽ WinSock (ΠΈΠ»ΠΈ Winsock 2). Для интСрфСйсов API, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‰ΠΈΡ… IPv6, Ρ‡ΠΈΡ‚Π°Ρ‚Π΅Π»ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π·Π°Ρ…ΠΎΡ‚Π΅Ρ‚ΡŒ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒΡΡ ΠΊ RFC 3493 ΠΏΠΎΠ΄ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ Β«Π Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ интСрфСйса сокСтов для IPv6Β».

Last updated

Was this helpful?