import socket sock = socket.socket(family=AF_INET, type=SOCK_STREAM, proto=0, fileno=None)
family=AF_INET
- семейство адресов, type=SOCK_STREAM
- тип сокета,proto=0
- номер протокола,fileno=None
- дескриптор сокета.Socket
.Функция socket()
модуля socket
создает новый сокет, используя указанное семейство адресов family
, тип сокета type
и номер протокола proto
.
socket.AF_INET
(по умолчанию), socket.AF_INET6
, socket.AF_UNIX
, socket.AF_CAN
, socket.AF_PACKET
или socket.AF_RDS
. socket.SOCK_STREAM
(по умолчанию), socket.SOCK_DGRAM
, socket.SOCK_RAW
или, возможно, одна из других констант socket.SOCK_*
. socket.AF_CAN
, протокол должен быть одним из socket.CAN_RAW
, socket.CAN_BCM
, socket.CAN_ISOTP
или socket.CAN_J1939
.Если указан аргумент fileno
, то значения для аргументов family
, type
и proto
автоматически определяются из указанного файлового дескриптора. Автоопределение можно отменить, вызвав функцию socket.socket()
с явными аргументами family
, type
или proto
.
Это влияет только на то, как Python представляет например, возвращаемое значение методом Socket.getpeername()
, но не фактический ресурс ОС. В отличие от функции socket.fromfd()
, fileno
вернет тот же сокет, а не его дубликат, что может помочь закрыть отсоединенный сокет с помощью метода Socket.close()
.
Вновь созданный сокет не наследуется.
Изменено в Python 3.7: Добавлен протокол socket.CAN_ISOTP
.
Изменено в Python 3.7: Когда битовые флаги socket.SOCK_NONBLOCK
или socket.SOCK_CLOEXEC
применяются к типу, они очищаются, и атрибут объекта сокета Socket.type
не будет их отражать. Они по-прежнему передаются в базовый системный вызов socket.socket()
. Следовательно,
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM | socket.SOCK_NONBLOCK)
по-прежнему будет создавать неблокирующий сокет в операционных системах, поддерживающих socket.SOCK_NONBLOCK
, но для атрибута объекта сокета Socket.type
будет установлено значение socket.SOCK_STREAM
.
Изменено в Python 3.9: Добавлен протокол CAN_J1939.
Изменено в Python 3.10: Добавлен протокол IPPROTO_MPTCP
.
# Echo server program import socket # Символическое имя, означающее # Все доступные интерфейсы HOST = '' # Произвольный непривилегированный порт PORT = 50007 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock: sock.bind((HOST, PORT)) sock.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 = '10.10.10.10' # тот же порт, что и у сервера 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))