Почему socketpair() допускает тип SOCK_DGRAM?
Недавно я узнал о программировании сокетов для Linux, в основном с этого сайта.
На сайте написано, что используется комбинация домен / тип PF_LOCAL
/SOCK_DGRAM
...
Предоставляет услуги дейтаграмм в локальном хосте. Обратите внимание, что эта служба не требует соединения, но надежна, за исключением того, что пакеты могут быть потеряны, если буферы ядра будут исчерпаны.
Мой вопрос, поэтому, почему socketpair(int domain, int type, int protocol, int sv[2])
разрешить эту комбинацию, когда в соответствии с его справочной страницей...
Вызов socketpair() создает безымянную пару подключенных сокетов в указанном домене указанного типа...
Здесь нет противоречия?
я думал SOCK_DGRAM
в PF_LOCAL
а также PF_INET
домены подразумевают UDP, который является протоколом без установления соединения, поэтому я не могу примирить кажущийся конфликт с socketpair()
Претензия на создание связанных сокетов.
1 ответ
Гнезда дейтаграмм имеют "псевдосвязи". Протокол на самом деле не имеет соединений, но вы все равно можете позвонить connect()
, Это связывает удаленный адрес и порт с сокетом, а затем он получает только пакеты, поступающие из этого источника, а не все пакеты, для которых назначен адрес / порт, с которым связан сокет, и вы можете использовать send()
скорее, чем sendto()
отправить обратно на этот удаленный адрес.
Примером, где это может быть использовано, является TFTP
протокол. Сервер изначально прослушивает входящие запросы по известному порту. После начала передачи используется другой порт, и отправитель и получатель могут использовать connect()
связать сокет с этой парой портов. Затем они могут просто отправить и получить на этом новом сокете для участия в передаче.
Точно так же, если вы используете socketpair()
с сокетами дейтаграмм он создает псевдосвязь между двумя сокетами.