套接字服务器一直在监听

时间:2018-05-27 16:05:33

标签: c# sockets windows-services

要求是服务器套接字应始终接受客户端套接字连接(Windows服务应用程序)。下面是几个小时可以正常工作的代码,但是在一段时间之后接受根本不起作用。为了始终保持接受,我还有每隔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 :(得分:0)

问题是服务器有vpn连接,它正在使用该IP地址。当vpn连接丢失服务器停止监听时。