сбой сети и последующее состояние сокета - PullRequest
0 голосов
/ 29 апреля 2011

Я хотел бы знать, как состояние сокета становится, когда сеть, в которой он работает, выходит из строя.Моя проблема в том, что когда я симулирую крах этой сети, функция select(), которая контролирует все сокеты, возвращает мне некоторый сокет, который теоретически не должен быть установлен.Возможно, операционная система установила сбойный сокет как при записи, так и при чтении?

Ответы [ 2 ]

1 голос
/ 29 апреля 2011

Первое, что нужно иметь в виду, это то, что ваш компьютер, как правило, не будет знать, когда "сеть падает" как таковая. Все, что компьютер будет знать, это то, получает ли он пакеты из сети или нет. (Некоторые компьютеры могут также знать, пропал ли электрический сигнал на их локальном порте Ethernet, но поскольку более удаленные части сети могут выйти из строя, не влияя на сигнал на локальном кабеле Ethernet, эта информация полезна лишь изредка ).

На практике, если сеть между вашим компьютером и (компьютером, с которым он разговаривал) перестает работать, вы увидите следующие эффекты:

(1) Любые отправленные вами UDP-пакеты будут отброшены без трассировки и, как правило, без указания ошибки. И, конечно же, вы не получите UDP-пакеты от удаленного узла.

(2) Трафик данных на любом TCP-соединении между вашим компьютером и удаленным узлом будет быстро остановлен. По истечении определенного времени ожидания (обычно несколько минут), когда ОС не получает никаких ответов от удаленного узла, операционная система «сдается» и помечает TCP-соединение как закрытое; в этот момент вы увидите поведение, идентичное тому, которое вы получили бы, если бы удаленный узел намеренно закрыл соединение: то есть select () вернет готовность к чтению (и, возможно, также готовность к записи, я забыл), и затем, когда вы попытаетесь выполнить recv () или read () для сокета, вы получите EOF (т.е. recv () для блокирующего сокета вернет 0; recv () для неблокирующего сокета вернет - 1). (если сеть восстанавливается до истечения времени ожидания, то TCP-трафик на вашем сокете возобновится, хотя он начнет медленно возобновляться и постепенно ускоряться со временем)

0 голосов
/ 29 апреля 2011

Ваше описание неясно, но вполне возможно, что select () сигнализирует о EOS в соответствующем сокете, который не будет представлять собой "сбой" сети, а упорядоченно близко от партнера, возможно, неожиданно для вас.

...