System.Net.Sockets.SocketException (0x80004005)

本文关键字:0x80004005 SocketException Net Sockets System | 更新日期: 2023-09-27 18:36:04

我正在编写一个机器人,用于在 C# 中审核我的 twitch.tv 通道。

下面是循环的基本代码,由后台辅助角色完成,以避免 UI 冻结。 有一个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.
    }

我收到消息"循环结束"和"哎呀!",在这一点上,我得到了异常(我一生都无法捕捉)。

问题是,我可以从计算机上物理拔下网线,等待 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 中。

我想我正在寻找的是一些关于为什么会发生这种情况的见解。

每次我启动机器人并让它在任何通道上运行几分钟时,它总是会发生,尽管分钟数各不相同。

System.Net.Sockets.SocketException (0x80004005)

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

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

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