C # Factory Async Socket ОШИБКА "Отключение хоста" - PullRequest
0 голосов
/ 30 ноября 2018
 async Task ReceiveFromClient()
        {
            if (this.m_ClientSocket.Connected == true)
            {
                try
                {
                    var asyncResult = this.m_ClientSocket.BeginReceive(m_LocalBuffer, 0, m_LocalBuffer.Length, SocketFlags.None, null, null);
        /* Exception here */ int bytesReceived = await Task<int>.Factory.FromAsync(asyncResult, _ => this.m_ClientSocket.EndReceive(asyncResult)); /* This is the line with Exception */

                    if (bytesReceived != 0)
                    {
                        Console.WriteLine("Packets received");
                        m_LocalSecurity.Recv(m_LocalBuffer, 0, bytesReceived);

                        List<Packet> ReceivedPackets = m_LocalSecurity.TransferIncoming();
                        if (ReceivedPackets != null)
                        {
                            foreach (Packet _pck in ReceivedPackets)
                            {
                                new PacketHandler.PacketFromClientHandler(this, _pck, null);
                            }
                        }

                    }
                    else
                    {
                        this.DisconnectModuleSocket();
                        this.m_delDisconnect.Invoke(ref m_ClientSocket);
                        return;
                    }

                    await Task.Factory.StartNew(this.ReceiveFromClient);

                }
                catch (AggregateException ae)
                {
                    Console.WriteLine(ae);
                }
                catch (SocketException ex)
                {
                    Console.WriteLine($"{ex.Message} ({ex.GetType()})");
                }

                //Exceptions: ArgumentNullException, SocketException, ObjectDisposedException, ArgumentOutOfRangeException
                catch (Exception e)
                {
                    this.DisconnectModuleSocket();
                    this.m_delDisconnect.Invoke(ref m_ClientSocket);
                    return;
                }
            }
        }

Здесь вы можете увидеть мой код, это Async TCP Socket, где я читаю Пакеты с клиента на сервер, все работает нормально, но когда пользователь отключается от сокета, строка «Комментарии» дает мне исключение.Я искал много часов, но я не нашел ответа на мою проблему.

Я уже пытался захватить исключение, но безуспешно.

Мне нужно что-то, чтоОстановите задачу и закройте соединение, когда пользователь отбрасывает соединение.

Ошибка, которую дает мне Visual Studio 2016:

Тип исключения: System.Net.Sockets.SocketException ErrorCode: 10054Сообщение: существующее соединение было принудительно закрыто удаленным хостом

Спасибо за помощь

1 Ответ

0 голосов
/ 01 декабря 2018

Спасибо за помощь, которую я получил от qqdev <3, просто измените эту строку: </p>

int bytesReceived = await Task<int>.Factory.FromAsync(asyncResult, _ => this.m_ClientSocket.EndReceive(asyncResult));

На эту:

int bytesReceived = await Task<int>.Factory.FromAsync(asyncResult, _ => {try { return this.m_ClientSocket.EndReceive(asyncResult); } catch(Exception ex) {} return 0; } );
...