Как узнать состояние розетки при отключении сетевого кабеля от сетевого адаптера - PullRequest
3 голосов
/ 11 января 2011

Я пишу коммуникационную программу с режимом c / s на C #, серверную и клиентскую программу на другом компьютере. Сегодня, после того как клиентская программа подключилась к серверной программе, затем я вытащил кабель из сетевого адаптера (после этого программа клиента и сервера ничего не делала), произошла странная вещь. Я обнаружил, что сокет серверной программы все еще сохраняет статус подключения. и я использую команду "netstat -a -n" для получения информации о сети и получения информации, подобной следующей:

TCP 192.168.1.2:3645 192.168.1.3:1863 УСТАНОВЛЕН

192.168.1.2 (IP-адрес сервера) 192.168.1.3 (IP-адрес клиента)

Кто-нибудь знает причину? Как решить эту проблему . Я хочу, чтобы серверная программа могла получить событие и закрыть сокет, когда сетевой кабель клиентского компьютера был извлечен.

Пожалуйста, дайте мне несколько советов или решений.

Спасибо

Ответы [ 3 ]

5 голосов
/ 12 января 2011

Я думаю, что это можно решить с помощью TCP keepalive.refrence http://tldp.org/HOWTO/TCP-Keepalive-HOWTO/overview.html

после подключения установить свойство активности активности сокета.msdn говорит, что статус этого переключателя по умолчанию выключен, если установлено значение keepalive, сокет будет автоматически проверять состояние сети, а время первой проверки - через 2 часа после последней операции с сокетом.но время может быть коротким.затем после первой проверки сокет будет работать несколько раз.Если соединение оборвано или прервано, сокет выдаст исключение.

C # Источник:

    uint dummy = 0;
    byte[] inOptionValues = new byte[Marshal.SizeOf(dummy) * 3];
    //set keepalive on
    BitConverter.GetBytes((uint)1).CopyTo(inOptionValues, 0); 
    //interval time between last operation on socket and first checking. example:5000ms=5s
    BitConverter.GetBytes((uint)5000).CopyTo(inOptionValues, Marshal.SizeOf(dummy));
    //after first checking, socket will check serval times by 1000ms.
    BitConverter.GetBytes((uint)1000).CopyTo(inOptionValues, Marshal.SizeOf(dummy) * 2);

    Socket socket = __Client.Client;
    socket.IOControl(IOControlCode.KeepAliveValues, inOptionValues, null);

Я проверил.Работает нормально.

3 голосов
/ 11 января 2011

Вы не можете. Единственный надежный способ проверить состояние подключенного устройства - это отправить данные по проводной сети, поэтому: устраните сбои подключения во время отправки / получения и, при необходимости, периодически проверяйте состояние подключения с помощью какой-либо формы ping, если вы хотите получить состояние подключения в периоды простоя .

0 голосов
/ 11 января 2011

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

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