Сообщить об ошибке.

Функция socketpair() модуля socket в Python

Создает клиентский и серверный подключенные сокеты

Синтаксис:

import socket

socket.socketpair([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