【发布时间】: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