2010-05-20 6 views
1

У меня есть клиент-серверная программа на C#.
Вот код сервера:Как узнать, когда Клиент отключен от Сервера в C#?

... 
String dataFromClient = ""; 
NetworkStream networkStream; 
TcpClient clientSocket; 
bool transfer = true; 
... 
while (transfer) 
    { 

     networkStream = clientSocket.GetStream(); 
     networkStream.Read(bytesFrom, 0, (int)clientSocket.ReceiveBufferSize); 
     dataFromClient = System.Text.Encoding.ASCII.GetString(bytesFrom); 
     dataFromClient = dataFromClient.Substring(0, dataFromClient.IndexOf("$")); 
     .... 
    } 

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

ответ

0

Невозможно, не пытаясь отправить некоторые данные.

Был хороший разговор о нем на StackOverflow, но я не могу показаться, чтобы быть в состоянии найти его сейчас ...

3

Это действительно невозможно обнаружить это непосредственно. Вы можете только попытаться свести к минимуму «ущерб».

Почему это невозможно?

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

Как мне с этим справиться?

Перед попыткой чтения/записи всегда проверяйте свойство Connected. Это не более чем простая проверка здравомыслия, состояние Connected всегда устарело (это объясняется его природой, объясненной выше, и нет возможности изменить это).

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

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

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