为什么我的IRC被挂断了?

时间:2015-01-03 17:03:21

标签: c# server irc

我正在写一个irc bot,所以我建立了一个连接服务器和频道的客户端。然后我需要一个身份服务器,所以我做了,然后将其调用到我的客户端。问题是,当我将我的Ident方法调用到我的客户端时,程序只是坐在那里,黑屏。我知道我可以使用irc库轻松完成这项工作,但我想用套接字来完成。

namespace TCPClient
{
    class IdentServer
    {
        int serverPort = 113;
        TcpListener listener = null;
        TcpClient client = null;
        public void Ident(string User)
        {
            listener = new TcpListener(IPAddress.Any, serverPort);
            listener.Start();
            string infoSent = "USER:UNIX:" + User;
            byte[] readBuf = new byte[600];
            //byte[] writeBuf = Encoding.ASCII.GetBytes(infoSent);
            for (; ; )
            {
                TcpClient client = null;
                NetworkStream netStream = null;
                client = listener.AcceptTcpClient();
                byte[] writeBuf = Encoding.ASCII.GetBytes(infoSent);
                netStream = client.GetStream();
                netStream.Write(writeBuf, 0, writeBuf.Length);
                int rece = netStream.Read(readBuf, 0, readBuf.Length);
                Array.Resize(ref readBuf, rece);

                Console.WriteLine(Encoding.ASCII.GetString(readBuf));
                netStream.Close();
                client.Close();
            }

        }

    }
}

这是客户端

namespace TCPClient
{
    class Program
    {
        static void Main(string[] args)
        {
            Thread t;
            byte[] Buffer = new byte[3000];
            TcpClient client = null;
            string user= "ABOT1";
            string nick ="NICK ABOT1";
            string channel = "JOIN #Chataholics";


            client = new TcpClient("asimov.freenode.net", 6667);
            IdentServer ident = new IdentServer();
            NetworkStream netStream = client.GetStream();
            byte[] nameBuff = Encoding.ASCII.GetBytes(nick);
            netStream.Write(nameBuff, 0, nameBuff.Length);
            byte[] channelBuf = Encoding.ASCII.GetBytes(channel);
            netStream.Write(channelBuf, 0, channelBuf.Length);
            ident.Ident(user);
            for (; ; )
            {
              int rec = netStream.Read(Buffer, 0, Buffer.Length);
              Array.Resize(ref Buffer, rec);
              Console.Write(Encoding.ASCII.GetString(Buffer));

            }

        }
    }
}

1 个答案:

答案 0 :(得分:1)

你在“Ident”-Code中有一个无限的for循环。你确定它退出了循环吗?如果它是无限的,你的代码将永远不会到达第二个for循环。

在客户端代码中的“ident.Ident(user)”行中放置一个断点并逐步执行。

编辑:您的代码似乎总体上是错误的。你的代码挂起了

client = listener.AcceptTcpClient();

在您的Ident服务器内。监听器正在等待客户端连接,但这种情况从未发生过,因此应用程序会等待,并且您将看到黑屏。

以下是我与IRC服务器的连接方式:

  1. 使用线程

  2. 使用Stream(Streamreader / Streamwriter),TCPClient 很好地支持。

  3. 确保根据RFC回复“PING”消息,否则您将断开连接。