Поведение send () и recv () в сокетной связи - PullRequest
3 голосов
/ 06 апреля 2010

Ниже приведены настройки:

Server         Client
 |                |
accept         connect
 |                |
 v                |
send msg1->       | 
 |                |
 v                v
recv    <-     send
 |                |
 v                v
send msg2->    recv
 |                |
 v                v
               close

Вот мой вопрос:
1. Клиент на самом деле получает сообщение msg1 до закрытия, почему это так?
2. отправить msg2 возвращается нормально. Поскольку клиент закрывается после получения сообщения msg1, почему отправка сообщения msg2 прошла успешно?

P.S. Я использую потоковый сокет для TCP.

Ответы [ 2 ]

5 голосов
/ 06 апреля 2010
  1. Функция recv будет получать все, что будет дальше в приемном буфере. В случае клиента, если сокет является сокетом дейтаграммы, то следующим будет msg1 . Если это сокет потока, то границы сообщений не поддерживаются, поэтому в recv могут быть включены данные как msg1 , так и msg2 , если прибыло msg2 и есть место для оба в буфере recv.

  2. send не ожидает от другой стороны recv сообщения, он просто добавляет его в очередь отправки. В этот момент он не знает, закроет ли клиент соединение перед его чтением. Если вам необходимо знать, что клиент должен отправить ответ для подтверждения сообщения.

4 голосов
/ 06 апреля 2010

После того, как ваше соединение установлено, ОС управляет пакетами, входящими и выходящими из вашей системы, вызов recv () просто читает буфер пакетов, а вызов send () просто ставит пакеты в очередь.

...