2010-07-22 5 views
7

Я помню, что где-то читал, что сокет можно рассматривать как два независимых полудуплексных канала. Означает ли это, что recv() и send() такого же сокета фактически не имеют значения?безопасно ли возвращать() и отправлять() на один сокет одновременно?

  • если да, то это по определению или конкретная реализация?
  • если нет, то как два мешают друг другу?

спасибо.

+1

зависит от протокола. TCP является полнодуплексным, так что да. – 2010-07-22 11:54:39

+0

Спасибо, у вас есть контр-пример? или любую другую ссылочную ссылку/код, чтобы я мог читать? –

ответ

1

Мне интересно, как вы думаете, будет мешать друг другу. Вы думаете, что можете получить то, что вы отправили?

+1

Нет, я имею в виду, как можно влиять на правильность или эффективность поведения другого, если они это делают. Например, если они имеют один и тот же буфер, очень вероятно, что нужно ждать, пока другой не будет работать, не так ли? –

+1

Вы можете выпустить блокировку или неблокировать отправку и получение. С блокировкой буфера данных вы передаете в IS буфер данных. Нет шансов на замешательство. С неблокируемым буфером данных копируется. В документации API, касающейся чередования, нет никаких ограничений, поэтому они должны использовать разные буферы; потому что, если бы они не были, они не могли быть неблокирующими (им пришлось бы блокировать друг друга). – 2010-07-29 08:59:36

1

В случае SOCK_STREAM вы можете использовать send/recv одновременно.

Ex: Предположим, у вас есть два потока, один отвечает за отправку данных и второй один отвечает за получение данных, которые вы можете сделать следующее

основной Рутинное: получить сокет дескриптором. создать поток POSIX для отправки буфера на этот fd. создать поток POSIX для получения данных, полученных из этого fd. подключиться к серверу.

Тема 1 Регулярность: построить буфер сообщений; отправьте буфер в этот fd.

Тема 2 Регулярность: данные recv от этого fd. обработать дату.