Как сохранить мой сервер в сети? - PullRequest
1 голос
/ 16 апреля 2011

В моей программе на 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 голосов
/ 16 апреля 2011

Вам нужно снова вызвать BeginAccept в OnAccept, чтобы он мог снова начать принимать новые подключения.Также я бы посоветовал не использовать 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);
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...