2014-02-24 6 views
0

저는 TCPClient를 사용하여 C#에서 IRC 봇을 작성하려고했습니다. PONG 명령으로 PING 명령에 응답하여 명령을 연결하고 시작합니다. 그게 다야..NET IRC TCPClient 읽기가 30-40 분 후에 중단됩니다.

그러나 다음과 같은 데이터 행을 읽는 기능에서 30-40 분 후에 중단됩니다. 나는 Wireshark를 사용하여 PING 및 PONG 메시지를 검사했으며 그들은 나에게 잘 보였다. Wireshark에서 내 컴퓨터가받은 ACK 패킷을 볼 때 PONG도 서버에 수신됩니다.

이상한 일은 30 ~ 40 분 동안 절대적으로 잘 작동한다는 것입니다. 제가 StreamReader에 문제가 있다고 생각하지만 며칠 동안 웹을 검색 한 후에 막혔습니다.

내 코드를 보는 사람이 너무 친절할까요? 많은 감사드립니다.

public class Bot 
{ 
    private NetworkStream ns; 
    private StreamReader reader; 
    private StreamWriter writer; 
    private Encoding enc;   // The encoding used. 

    /// <summary> 
    /// Initialize the bot. 
    /// </summary> 
    public Bot() 
    { 
     enc = new UTF8Encoding(); 
    } 

    /// <summary> 
    /// Connects the an IRC server. 
    /// </summary> 
    /// <param name="url">The url of the server.</param> 
    /// <param name="port">The port to connect to.</param> 
    /// <param name="user">The username to use.</param> 
    /// <param name="nick">The nick to use.</param> 
    /// <param name="realName">The users real name.</param> 
    public void Connect(string url, ushort port, string user, string nick, string realName) 
    { 
     TcpClient client = new TcpClient(); 

     try 
     { 
      client.Connect(url, port); 
     } 
     catch (Exception ex) 
     { 
      throw new Exception("Could not connect to endpoint.", ex); 
     } 

     ns = client.GetStream(); 
     reader = new StreamReader(ns, enc); 
     writer = new StreamWriter(ns, enc); 
     writer.AutoFlush = true; 

     Send("USER " + user + " 0 * :" + realName + "\r\n"); 
     Send("NICK " + nick + "\r\n"); 
    } 

    /// <summary> 
    /// Processes a command. 
    /// </summary> 
    /// <param name="command">The command to process.</param> 
    public virtual void ProcessCommand(IRCCommand command) 
    { 
     if(command.Command == "PING") 
     { 
      Send("PONG :" + command.Parameters[0] + "\r\n"); 
     } 
    } 

    /// <summary> 
    /// Receives and processes a command. 
    /// </summary> 
    public void ReceiveAndProcess() 
    { 
     string line = reader.ReadLine(); 

     if (!string.IsNullOrEmpty(line)) 
     { 
      Console.WriteLine("raw : " + line); 

      IRCCommand cmd = new IRCCommand(); 
      cmd.Parse(line); 

      ProcessCommand(cmd); 
     } 
    } 

    /// <summary> 
    /// Sends a command to the irc server. 
    /// </summary> 
    /// <param name="ircCommand">The command to send.</param> 
    protected void Send(string ircCommand) 
    { 
     Console.Write("sent: " + ircCommand); 
     writer.Write(ircCommand); 
    } 
} 

답변

0

나는 TCPClient에서 실제로 읽지 못하는 문제를 발견했습니다. 문제는 내 ISP가 채널에서 30 분 동안 사용하지 않으면 연결이 끊어 졌다는 것입니다. IRC 탁구는 인터넷에서 (bot) 사용자에게 계속되는 요청/응답입니다. ISP는 이런 종류의 요청 - 응답 활동을 잠재적 인 봇넷으로보고 연결을 종료합니다.

이 문제를 방지하기 위해 매분마다 서버에 PING을 보내도록 봇을 변경했습니다. 이렇게 변경된 봇은 1 주일 내내 안정을 유지했습니다 (24/7).