socketpair()

Создание пары соединенных сокетов

Прототип:

#include <sys/types.h>
#include <sys/socket.h>
int socketpair( int domain,
int type,
int protocol,
int *fd[2] );

Аргументы:

domain
Коммуникационный домен, в котором будут созданы сокеты.
type
Тип создаваемых сокетов.
protocol
Протокол для использования с сокетами. Протокол 0 заставляет socketpair() использовать протокол по умолчанию, подходящий для запрошенного типа сокета.
fd[2]
Массив из 2 целых чисел, где будут храниться файловые дескрипторы для пары сокетов.

Библиотека:

libsocket

Описание:

Вызов socketpair() создает безымянную пару подключенных сокетов в указанном domain указанного type, используя необязательно указанный аргумент protocol. Дескрипторы файлов возвращаются в массиве fd и идентичны.

Допустимые типы описаны в socket().

Если аргумент protocol не равен нулю, то это должен быть протокол, который поддерживается семейством адресов. В настоящее время такие протоколы не определены.

Возвращаемое значение:

0
Успешное завершение.
-1
Возникла ошибка. Код ошибки записан в errno.

Коды ошибок:

EAFNOSUPPORT
Указанное семейство адресов не поддерживается на этом компьютере.
EFAULT
Адрес sv не указывает на действительную часть адресного пространства процесса.
EMFILE
Текущий процесс использует слишком много дескрипторов.
EOPNOTSUPP
Указанный протокол не поддерживает создание пар сокетов.
EPROTONOSUPPORT
Указанный протокол не поддерживается на этом компьютере.

Примеры:

#include <stdio.h>
#include <sys/socket.h>
#define CHAR_BUFSIZE 20
int main( int argc, char **argv )
{
int fd[2], len;
char message[CHAR_BUFSIZE];
if ( socketpair( AF_LOCAL, SOCK_STREAM, 0, fd ) == -1 )
{
return (1);
}
/* If you write to fd[0], you read from fd[1], and vice versa. */
/* Print a message into one end of the socket */
snprintf( message, CHAR_BUFSIZE, "First message" );
write( fd[0], message, strlen( message ) + 1 );
/* Print a message into the other end of the socket */
snprintf( message, CHAR_BUFSIZE, "Second message" );
write( fd[1], message, strlen( message ) + 1 );
/* Read back the data written to the first socket */
len = read( fd[0], message, CHAR_BUFSIZE - 1 );
message[len] = '\0';
printf( "Read [%s] from first fd \n", message );
/* Read back the data written to the second socket */
len = read( fd[1], message, CHAR_BUFSIZE - 1 );
message[len] = '\0';
printf( "Read [%s] from second fd \n", message );
close( fd[0] );
close( fd[1] );
return (0);
}

Классификация:

POSIX 1003.1

Точка остановки потока
Да
Обработчик прерываний
Нет
Обработчик сигналов
Нет
В потоке
Да

Тематические ссылки:

read(), socket(), write()




Предыдущий раздел: Описание API сетевой библиотеки