Имитация Socket Hard Disconnect - PullRequest
       1

Имитация Socket Hard Disconnect

1 голос
/ 03 сентября 2010

У меня есть приложение на C #, в котором сервер и некоторые клиенты общаются с разных компьютеров с помощью сокетов.

В большинстве случаев сервер правильно обнаруживает разъединение, когда получает 0 байтов в вызове sock.Receive (...). Но когда возникает проблема с оборудованием (например, сетевой кабель отключен), возникает проблема. Один серверный поток продолжает блокировать sock.Receive (...), потому что он не знает, что соединение потеряно. Я собирался добавить сообщение сердцебиения, чтобы обнаружить это, но я хотел проверить это в dev.

Но я не уверен, как я могу протестировать этот случай без реальной проблемы с оборудованием. Даже когда я просто убиваю клиентский процесс, сокету каким-то образом удается изящно отключиться (то есть сервер выполняет чтение 0 байтов). Эта проблема возникает только при физическом отключении клиентского компьютера от сети.

Есть ли способ, которым я могу симулировать эту проблему в dev?

1 Ответ

5 голосов
/ 03 сентября 2010

Вам необходимо явно сообщить WinSock, что вы не хотите, чтобы он очистился для вас после закрытия сокета. Это делается установкой LingerState следующим образом:

socket.LingerState = new LingerOption(true, 0);
socket.Close();

LingerState немного сбивает с толку, потому что если вы отключите задержку, WinSock на самом деле задержит , но не заблокирует вашу программу. Вы должны включить задержку и установить время ожидания на ноль, чтобы заставить WinSock разорвать соединение.

P.S. Если вам нужна информация о пакетах keepalive (heartbeats), Я написал запись в блоге на эту тему .

Обновление:

Я перечитал ваш вопрос (и прокомментировал), и мой ответ неправильный ...

Код выше будет имитировать аварийное закрытие, а не полуоткрытое положение. В программном обеспечении нет способа имитировать полуоткрытую ситуацию; вам нужно отсоединить кабель Ethernet, который не подключен ни к одному компьютеру, чтобы проверить это (например, протяните кабель между двумя коммутаторами в этой конфигурации: компьютер A <-> коммутатор <-> коммутатор <-> компьютер B).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...