2015-01-04 4 views
0

Я пишу бота для модерации моего канала twitch.tv в C#.System.Net.Sockets.SocketException (0x80004005)

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

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. 
    } 

Получаю сообщение «Loop закончился» и «OOPS!». и в этот момент я получаю исключение (которое я не могу для жизни меня поймать).

Дело в том, что я могу физически отключить сетевой кабель от компьютера, подождите 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) 

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

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

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

+0

Twitch.tv использует IRC в качестве базовой системы , Вы добавили ответы PING? Я думаю, что сервер ударит вас через некоторое время, если вы не ответите на него. – Live

+0

@Live Хм, хорошо, это интересно, я не знал, что сервер сделал это. Как я могу ответить на это? – electroball09

+0

Обычно с ответом PONG. Подробнее читайте в протоколе IRC-клиента в [RFC2812] (https://tools.ietf.org/html/rfc2812#section-3.7.3). – Live

ответ

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(); 
} 
Смежные вопросы