【问题标题】:socket server listening all the time套接字服务器一直在监听
【发布时间】:2018-06-15 13:37:27
【问题描述】:

要求服务器套接字应始终接受客户端套接字连接(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;
}

【问题讨论】:

  • 使用 cmd.exe >Netstat -a 在连接失败时检查连接状态。
  • 如何知道何时失败。服务器套接字不应该失败吗?
  • 不听的时候。连接由于某种原因而中断。一些服务器空闲时会关闭。不确定这就是我要求检查连接状态的原因。

标签: c# sockets windows-services


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2021-11-05
    • 1970-01-01
    • 2016-11-06
    • 2017-05-01
    • 1970-01-01
    • 2018-10-22
    • 2011-02-15
    • 2016-10-12
    • 2017-07-20
    相关资源
    最近更新 更多