Закрыть клиентское гнездо при отключении - PullRequest
1 голос
/ 18 февраля 2011

У меня есть серверное приложение, которое слушает клиентов. Давайте клиент потерял подключение к Интернету и потерял связь с сервером.

Проверяет ли сервер автоматически, когда клиент был отключен? Если нет, то как я могу реализовать это?

Main.cs http://pastebin.com/fHYpErz7

ServerSocket.cs: http://pastebin.com/erw4tzdp

Client.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.Sockets;

namespace jM2
{
    class Client
    {
        private int clientConnectionID;
        private Socket clientSocket;
        private string clientIP;
        private byte[] clientBuffer = new byte[1024];

        public Client(int connectionID, Socket connectionSocket)
        {
            clientConnectionID = connectionID;
            clientSocket = connectionSocket;
            clientIP = connectionSocket.RemoteEndPoint.ToString();
            clientSocket.BeginReceive(clientBuffer, 0, clientBuffer.Length, SocketFlags.None, new AsyncCallback(dataArrival), null);
        }
        public void Disconnect()
        {
            clientSocket.Close();
        }
        private void dataArrival(IAsyncResult iar)
        {
            int bytesReceived = clientSocket.EndReceive(iar);
            clientSocket.BeginReceive(clientBuffer, 0, clientBuffer.Length, SocketFlags.None, new AsyncCallback(dataArrival), null);
        }
    }
}

Ответы [ 3 ]

2 голосов
/ 18 февраля 2011

Смотрите мой ответ на этот вопрос:

TcpClient.Close не закрывает соединение

В принципе никто не знает, закрыто ли соединение, пока вы не попытаетесьотправить данные.Если это не удается, соединение закрывается.

0 голосов
/ 19 февраля 2011

Я рекомендую тип сообщения "poll" или "heartbeat", , как описано здесь .

0 голосов
/ 19 февраля 2011

Судя по тому, что сказал Крис Хаас, я могу ошибаться, однако ранее я написал TCP-сервер и обнаружил закрытые соединения, когда получил 0 байтов.Другими словами, в вашем методе dataArrival, если значение bytesReceived равно 0, это будет означать, что соединение закрыто.Похоже, это сработало благодаря довольно обширному тестированию.

...