2012-06-07 2 views
2

я не могу найти много документации, чтобы сказать, что это, должно ли произойти или нет:Вызывает ли вызов выключения сокета из другого потока блокировки recv() потоков?

  1. Некоторых нитей открывает TCP (или другой поток) сокеты
  2. Thread 1 начинает блокирующий ПРИЕМ()
  3. Thread 2 вызывает shutdown() в сокете с SHUT_RDWR (или SHUT_RD, я думаю)
  4. Thread 1 теперь «проснулся» от его блокирующего вызова и возвращает ноль, как если бы другая сторона закрыла свой сокет.

Такое поведение наблюдается в современных системах Linux и FreeBSD. Я не тестировал его ни с кем другим.

Комментарий к странице справки Microsoft MSDN здесь: http://msdn.microsoft.com/en-us/library/windows/desktop/ms740481%28v=vs.85%29.aspx предполагает, что это поведение является «ответственным» в Windows; он также утверждает, что это «в настоящее время не так», но это может быть устаревшим.

Это поведение указано в любом месте? Могу ли я на это положиться?

ответ

1

Я не думаю, что вы можете положиться на него. shutdown() shutdown, но детали зависят от конкретных обстоятельств. Некоторые протоколы могут действительно закрыть соединение и сокет немедленно, что приведет к пробуждению процессов, спящих на этом сокете. В других случаях shutdown просто запускает машину состояния протокола в действие, но потребуется некоторое время, пока она не дойдет до точки, когда имеет смысл разбудить кого-либо. Например, установленное TCP-соединение должно пройти через несколько состояний, пока не достигнет состояния CLOSED. Вы, в конце концов, проснетесь, но вы не можете сразу полагаться на это.

Смежные вопросы