1

我有侦听客户端的服务器应用程序。让我们的客户端失去互联网连接并失去与服务器的连接。

服务器是否会自动检查客户端何时断开连接?如果不是,我该如何实施这样的事情?

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

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

客户端.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 回答