处理连接到套接字服务器的每个套接字客户端

时间:2017-05-18 14:41:20

标签: c# .net sockets

我刚刚开始使用Socket开发服务器 - 多个客户端应用程序。

服务器无需跟踪连接的客户端;如果有客户端请求连接,则服务器接受它。如果有来自任何客户端的请求(获取某些数据),服务器将响应该客户端。

/// <summary>
/// Callback when server accepts a new incoming connection.
/// </summary>
/// <param name="result">Incoming connection result object.</param>
private void AcceptedCallback(IAsyncResult result)
{
  try
  {
      Socket clientSocket = _socket.EndAccept(result); // Asynchronously accepts an incoming connection attempt

      if (clientSocket.Connected)  // Check if the client is in 'Connected' state
      {
        StateObject state = new StateObject();
        state.clientSocket = clientSocket;
        clientSocket.BeginReceive(state.buffer, 0, StateObject.BufferSize, SocketFlags.None, // Start listening to client request
                                  ReceiveCallback, state);
      }
      else
      {
            clientSocket.Close();    // Terminate that client's connection
        Log.writeLog("TCPServer(AcceptedCallback)"
                     , "Client's status is not connected.");
      }
  }
  catch (Exception ex)
  {
      Log.writeLog("TCPServer(AcceptedCallback)"
                 , ex.Message);
      clientSocket.Close();
  }
  finally
  {
      Accept(); // Start to accept new connection request
  }
}

我有3个问题:

  1. 对于我为新连接的客户端创建的每个 BeginReceive ,我的服务器应用程序是否创建了一个新的线程/对象来保存该客户端?

  2. 如果在连接客户端后,在客户端拔出网线并重新插入,客户端将再次连接到服务器,这被认为是服务器上的新连接,如果这样场景一次又一次地发生,我的服务器程序会崩溃吗?

  3. 因此,我是否需要跟踪连接到服务器的每个客户端,并找到跟踪其状态的方法,以便我可以对它们调用Close / Dispose?

  4. 到目前为止,在我对方案2的测试中,我的服务器程序中没有检测到异常,但我希望有人会帮我澄清一下。谢谢。

1 个答案:

答案 0 :(得分:0)

  1. 不,它将使用来自线程池的IO完成线程。
  2. 不,您可以编码并应编码以满足此需求。如果操作系统可以检测到的客户端发生了某些事情,它将向服务器发送TCP fin / ack。这应该导致任何BeginXXX方法仍在等待异步回调方法。从那里调用EndXXX方法应该抛出异常或返回从套接字读取的零字节。
  3. 这取决于您的意思,通过跟踪妥善处理它们。如果您的意思是在检测到错误时将其丢弃,则可以在EndXXX方法中清理代码。如果你的意思是如果关闭服务器就可以优雅地向客户发信号,那么是的。