System.Net.Sockets.SocketException(0x80004005)

时间:2015-01-04 19:26:17

标签: c# sockets visual-studio-2013 socketexception twitch

我正在编写一个用于在C#中调节我的twitch.tv频道的机器人。

这是循环的基本代码,由后台工作人员完成以避免UI冻结。有一个TCPClient(客户端),StreamReader(读取器),StreamWriter(Writer)和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.
    }

我收到消息“循环结束”和“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中。

我想我正在寻找的是为什么会发生这种情况。

每次启动机器人时都会发生这种情况,并且在任何频道上都会运行几分钟,尽管分钟数会有所不同。

1 个答案:

答案 0 :(得分:1)

正如我在评论中已经说过的,Twitch.tv使用IRC作为他们聊天的底层系统。为了与服务器保持连接,您需要回复服务器经常发送的“PING”请求(通常每30秒,可能会因服务器实现而异)。您可以在RFC 2812中阅读有关IRC客户端协议的更多信息。

你说你已经有了StreamWriter和Reader,你需要做的就是检查该行是否包含“PING”并回复“PONG”:

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