сокет сервер слушает все время - PullRequest
0 голосов
/ 27 мая 2018

Требуется, чтобы сокет сервера постоянно принимал соединение с сокетом клиента (приложение-служба Windows).Ниже приведен код, который отлично работает в течение нескольких часов, но через какое-то время accept не работает вообще.Чтобы постоянно принимать, у меня также есть нить, которая соединяет сервер каждые 10 минут.Таким образом я узнал, что сокет сервера остановился через некоторое время (несколько часов)

public void StartReceiveNotification()
{
    if (!isStarted)
    {
        try
        {
            byte[] bytes = new Byte[1024];
            var ips = Dns.GetHostAddresses(Dns.GetHostName());
            var myAddress = ips.FirstOrDefault(ip => ip.AddressFamily == AddressFamily.InterNetwork);
            assigningIp = myAddress; 
            server = new TcpListener(myAddress, 11001);
            server.Start();

            AcceptSockets();
            isStarted = true;
        }
        catch (Exception ex)
        {
            logger.Error(ex);
        }
    }
}

private void AcceptSockets()
{
    try
    {
        while (true)
        {
            var acceptedSocket = server.AcceptSocket();
            var state = new StateObject { BufferSize = 6000, Socket = acceptedSocket };
            acceptedSocket.BeginReceive(state.Buffer, 0, state.BufferSize, 0, this.ReadCallback, state);
            acceptedSockets.Add(acceptedSocket);
        }
    }
    catch (Exception ex)
    {
        logger.Error(ex);// no exception but stops accepting socket
    }
}

internal ElapsedEventHandler SendKeepLiveCommand()// triggers every 10 min
{
    try
    {
        if (assigningIp != null)
        {
            var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            socket.Connect(assigningIp, 11001);
            socket.Send(ASCIIEncoding.ASCII.GetBytes("keepAlive"));
            socket.Disconnect(false);
            socket.Dispose();
        }
    }
    catch (Exception ex)
    {
        logger.Error(ex);// get exception after several hours
    }
    return null;
}

1 Ответ

0 голосов
/ 15 июня 2018

проблема была в том, что у сервера было соединение vpn, и это использовало тот IP-адрес.когда потерял соединение vpn сервер перестал слушать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...