Как исправить: сервер tcp, имеющий близкое ожидание после того, как клиент отключился - PullRequest
0 голосов
/ 19 июня 2019

У меня есть tcp сервер, который зависает с «Close_Waits».Мне нужно иметь пример программы, которая имеет дело с постоянным подключением от клиента.

Я попытался перехватить исключения и затем закрыть сокет внутри защелки.Но не повезло!

protected virtual void ReceiveCallBack(IAsyncResult result)
{
    var wrapper = (ConnectedSocketWrapper)result.AsyncState;
    try
    {

        int bytesRead = 0;

        bytesRead = wrapper.ConnectedSocket.EndReceive(result);

        LogInfo("Byte Read" + bytesRead.ToString());

        if (bytesRead > 0)
        {
            LogInfo("inside Byte Read > 0 : " + bytesRead.ToString());
            byte[] dataRead = wrapper.Buffer.Take(bytesRead).ToArray();

            wrapper.ConnectedSocket.BeginReceive(wrapper.Buffer, 0, this.configuration.BytesToReceiveInReadOperation, SocketFlags.None, this.ReceiveCallBack, wrapper);

            DataReceivedByServer dataReceived = new DataReceivedByServer(wrapper.Token, dataRead);

            EventDispatcher.RaiseEvent(dataReceived);

            if (DataReceived != null)
            {
                DataReceived(this, new DataReceivedEventArgs(dataRead, wrapper.Token));
            }

        }
        else
        {
            EventDispatcher.RaiseEvent(new ClientDisconnected(wrapper.Token, "Read 0 bytes (client disconnected gracefully)", wrapper.ConnectedSocket.RemoteEndPoint.ToString()));

            LogInfo("inside Byte Read = 0 : " + bytesRead.ToString());
            Close(wrapper.ConnectedSocket);
            Socket removeSocket;
            connectedSockets.TryRemove(wrapper.Token, out removeSocket);
        }
    }
    catch
    {
        Close(wrapper.ConnectedSocket);
        throw;
    }

}

Мне нужен свободный зависший TCP-сервер, который бы беспрепятственно обрабатывал запросы.

1 Ответ

0 голосов
/ 09 июля 2019

На вашем месте я бы проверил код и / или использовал бы этот simpsockets , он вполне читабелен.

Также отметьте это MultiProtocolAspNetCore , это о том, как построить TCP сервер поверх ASP.NET Core.

Также прочитайте этот удивительный TCP / IP.NET Socket FAQ .

...