System.Net.Sockets.SocketException (0x80004005)

Я пишу бота для модерации моего канала twitch.tv на С#.

Вот базовый код для цикла, который выполняется фоновым рабочим, чтобы избежать зависаний пользовательского интерфейса. Есть TCPClient (клиент), StreamReader (читатель), StreamWriter (писатель) и NetworkStream (поток).

    private void listener_dowork(object sender, DoWorkEventArgs e)
    {
        string Data = "";
        while ((Data = Reader.ReadLine()) != null)
        {
            //Perform operations on the received data
        }
        Console.WriteLine("Loop ended");//this shouldn't happen
    }
    private void listener_workercompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        //basically, display a console message that says "OOPS!" and try to reconnect.
    }

Я получаю сообщение "Цикл завершен" и "Упс!" и в этот момент я получаю исключение (которое я не могу поймать на всю жизнь).

Дело в том, что я могу физически отключить сетевой кабель от своего компьютера, подождать 30 секунд и снова подключить его, и все будет нормально.

Полное исключение:

System.Net.Sockets.SocketException (0x80004005): An established connection was aborted by the software in your host machine
   at System.Net.Sockets.Socket.Send(Byte[] buffer, Int32 offset, Int32 size, SocketFlags socketFlags)
   at System.Net.Sockets.NetworkStream.Write(Byte[] buffer, Int32 offset, Int32 size)

Обратите внимание на отсутствие номера строки, который присутствует во всех других типах исключений, которые у меня были, что означает, что я понятия не имею, какая часть программы вызывает исключение, хотя я поместил каждую возможную строку в попытку /поймать.

Я думаю, что я ищу, это некоторое понимание того, почему это происходит.

Это происходит неизменно каждый раз, когда я запускаю бота и оставляю его работать на несколько минут на любом канале, хотя количество минут варьируется.


person electroball09    schedule 04.01.2015    source источник
comment
Twitch.tv использует IRC в качестве базовой системы. Вы добавили ответы PING? Я думаю, что сервер выкинет вас через определенное время, если вы не ответите на него.   -  person Live    schedule 04.01.2015
comment
@Live Хм, хорошо, это интересно, я не знал, что сервер сделал это. Как бы я ответил на это?   -  person electroball09    schedule 04.01.2015
comment
Обычно с ответом PONG. Подробнее о клиентском протоколе IRC читайте в RFC2812.   -  person Live    schedule 04.01.2015
comment
Причина отсутствия номера строки в том, что это происходит внутри фреймворка. Это исключение относится к операции записи, для которой вы не показали никакого кода, выполняющего запись... Это говорит вам о том, что вы пытаетесь записать соединение, которое было закрыто удаленным сервером.   -  person Erik Funkenbusch    schedule 04.01.2015
comment
@Live Хорошо, похоже, что это было. Обязательно добавлю эту страницу в закладки, спасибо за помощь.   -  person electroball09    schedule 05.01.2015
comment
Я отредактировал ваш заголовок. См. Должны ли вопросы включать «теги» в свои заголовки?, если нет единого мнения, не следует.   -  person John Saunders    schedule 05.01.2015


Ответы (1)


Как я уже сказал в комментариях, Twitch.tv использует IRC в качестве базовой системы для своего чата. Чтобы оставаться на связи с сервером, вам необходимо отвечать на запросы «PING», которые часто отправляются сервером (обычно каждые 30 секунд, может варьироваться в зависимости от реализации серверов). Подробнее о клиентском протоколе IRC можно прочитать в RFC 2812.

Вы сказали, что у вас уже есть StreamWriter и Reader, все, что вам нужно сделать, это проверить, содержит ли строка «PING», и ответить «PONG»:

if (Data.Contains("PING"))
{
  _streamWriter.WriteLine(Data.Replace("PING","PONG");
  _streamWriter.Flush();
}
person Live    schedule 04.01.2015