저는 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);
}
}