我的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);
}
它完美无缺......直到一段时间后我发现它处于脱机状态。有时我看到新客户端无法连接的情况,但之前连接的旧客户端仍然连接。它不会经常发生,因此很难找出原因。
如果应用程序运行且我的互联网在线,我如何确保我的服务器始终在线?
我有一些想法,但我想知道什么是正确的方法。
答案 0 :(得分:0)
您需要在OnAccept中再次调用BeginAccept,以便它可以再次开始接受新连接。另外我建议不要使用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);
}
}