import socket socket.socketpair([family[, type[, proto]]])
family
- Семейство адресов,type
- тип сокета, proto
- номер протокола.Функция socketpair()
модуля socket
создает пару подключенных объектов сокета, используя заданное семейство адресов family
, тип сокета type
и номер протокола proto
.
Семейство адресов, тип сокета и номер протокола такие же, как для функции socket.socket()
.
Семейство адресов по умолчанию - socket.AF_UNIX
, если оно определено на платформе, в противном случае значение по умолчанию - socket.AF_INET
.
Вновь созданные сокеты не наследуются.
Типы сокетов и номера протоколов определены в модуле в качестве констант.
import socket import errno def create_sock_pair(port=0): """Создает пару сокетов. Если `socket.socketpair` недоступна, то происходит имитация этой функции. """ # Проверяем доступность функции socketpair(). have_socketpair = hasattr(socket, 'socketpair') if have_socketpair: client_sock, srv_sock = socket.socketpair() return client_sock, srv_sock # Создаем неблокирующий временный серверный сокет temp_srv_sock = socket.socket() temp_srv_sock.setblocking(False) temp_srv_sock.bind(('', port)) port = temp_srv_sock.getsockname()[1] temp_srv_sock.listen(1) # Создать неблокирующий клиентский сокет client_sock = socket.socket() client_sock.setblocking(False) try: client_sock.connect(('localhost', port)) except socket.error as err: # EWOULDBLOCK не является ошибкой, #поскольку сокет не блокирует if err.errno != errno.EWOULDBLOCK: raise # Используем модуль select, чтобы дождаться #успешного завершения connect () import select timeout = 1 readable = select.select([temp_srv_sock], [], [], timeout)[0] if temp_srv_sock not in readable: raise Exception(f'Клиент не подключился в течении {timeout} сек.') srv_sock, _ = temp_srv_sock.accept() return client_sock, srv_sock