如何保持我的服务器在线?

时间:2011-04-16 02:13:15

标签: c# sockets

我的C#程序有一台服务器。它是这样开始的:

serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPEndPoint ipEndPoint = new IPEndPoint(IPAddress.Any, port);
serverSocket.Bind(ipEndPoint);
serverSocket.Listen(10);
serverSocket.BeginAccept(new AsyncCallback(OnAccept), null);

OnAccept:

private void OnAccept(IAsyncResult ar) 
{
            try
            {
                Socket clientSocket = serverSocket.EndAccept(ar);
                clientSocket.BeginReceive(byteData, 0, byteData.Length, SocketFlags.None,
                    new AsyncCallback(OnReceive), clientSocket);
                AddLog("підключення", "Спроба нового підключення");
            }
            catch (Exception ex)
            {
                AddLog("підключення", "ПОМИЛКА нового підключення. " + ex.Message);
            }
            serverSocket.BeginAccept(new AsyncCallback(OnAccept), null);
}

它完美无缺......直到一段时间后我发现它处于脱机状态。有时我看到新客户端无法连接的情况,但之前连接的旧客户端仍然连接。它不会经常发生,因此很难找出原因。

如果应用程序运行且我的互联网在线,我如何确保我的服务器始终在线?

我有一些想法,但我想知道什么是正确的方法。

1 个答案:

答案 0 :(得分:0)

您需要在OnAccept中再次调用BeginAccept,以便它可以再次开始接受新连接。另外我建议不要使用Socket,而是使用TcpListener代替更高级别的API。

这样的事情应该有效:

private void OnAccept(IAsyncResult ar)
{
   bool beginAcceptCalled = false;
   try
   {
       //start the listener again
       _listener.BeginAcceptSocket(OnAccept, null);
       beginAcceptCalled = true;
       Socket socket = _listener.EndAcceptSocket(ar);
       socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveTimeout, 15 * 60 * 1000);
   }
   catch (Exception ex)
   {
       Logger.Error(string.Empty, ex);
       if (!beginAcceptCalled)
       {
          //try listening to connections again
          _listener.BeginAcceptSocket(OnAccept, null);
        }
    }