1

クライアントをリッスンするサーバー アプリケーションがあります。クライアントがインターネット接続を失い、サーバーとの接続が失われたとしましょう。

サーバーは、クライアントが切断されたときに自動的にチェックしますか? そうでない場合、どうすればそのようなことを実装できますか?

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);
        }
    }
}
4

3 に答える 3

2

この質問に対する私の答えを参照してください:

TcpClient.Closeは接続を閉じません

基本的に、データを送信しようとするまで、接続が閉じられているかどうかは誰にもわかりません。失敗した場合、接続は閉じられます。

于 2011-02-18T20:51:55.403 に答える
1

Chris Haas が言ったことに基づいて、私は間違っているかもしれませんが、以前に TCP サーバーを作成し、0 バイトを受信したときに閉じられた接続を検出しました。つまり、dataArrival メソッドで、bytesReceived が 0 の場合、これは接続が閉じられたことを示します。これは、かなり広範なテストを通じて機能するように見えました。

于 2011-02-18T21:02:05.067 に答える
0

ここで説明するように、「ポーリング」または「ハートビート」メッセージのタイプをお勧めします。

于 2011-02-18T21:06:12.377 に答える