Irc客户端识别协议" No Ident repsonse"

时间:2015-01-02 00:20:53

标签: c# client protocols server irc

我的客户端无法连接到我尝试连接的irc服务器。我做了一些研究,它说我需要侦听端口113并以某种格式回复服务器。我不确定如何做到这一点。当我在收到错误消息之前尝试这样做时。这是我尝试收听之前的代码。 irc将消息发送给我的客户"没有身份响应"。我是否需要一起创建一个完全不同的端口,以便在端口113上进行响应,或者我可以在这里进行响应吗?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net;
using System.Net.Sockets;

namespace ConnectIRC
{
    class Program
    {
        static void Main(string[] args)
        {
            string ip = "asimov.freenode.net";
            string nick = " NICK IKESBOT \r\n";
            string join = "JOIN #NetChat\r\n";
            int port = 6667;

            const int recvBufSize = 8162;
            byte[] recvbBuf = new byte[recvBufSize];
            //stores the nick
            byte[] nickBuf = Encoding.ASCII.GetBytes(nick);
            //Stores the room join
            byte[] joinBuf = Encoding.ASCII.GetBytes(join);

            Socket conn = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            conn.Connect(ip, port);

            conn.Send(nickBuf, nickBuf.Length, SocketFlags.None);
            conn.Send(joinBuf, joinBuf.Length, SocketFlags.None);


            for(;;){              
                byte[] buffer = new byte[3000];
                int rec = conn.Receive(buffer, 0, buffer.Length, 0);
                Array.Resize(ref buffer, rec);
               Console.WriteLine(Encoding.Default.GetString(buffer));
            }   
        }
    }
}

2 个答案:

答案 0 :(得分:0)

是的,您需要创建一个完全独立的端口来监听并回复身份请求

有关身份的更多信息,请访问here

答案 1 :(得分:0)

尽管@ Saruman上面的回答,你不需要创建一个ident服务器来连接大多数IRC网络(包括freenode)。您可以完全忽略有关“无识别响应”的错误。这是一种过时的技术,不再安全,只能在基于Unix的多用户系统上正常工作。

您的实际问题似乎是您从未完成注册与IRC服务器的连接。规范声明您需要发送USER和NICK消息:

string ip = "asimov.freenode.net";
string nick = "NICK IKESBOT \r\n";
// format is: USER <username> * * :<realname>
string user = "USER IKESBOT * * :IKESBOT\r\n";
string join = "JOIN #NetChat\r\n";
int port = 6667;

const int recvBufSize = 8162;
byte[] recvbBuf = new byte[recvBufSize];
//stores the nick
byte[] nickBuf = Encoding.ASCII.GetBytes(nick);

byte[] userBuf = Encoding.ASCII.GetBytes(user);
//Stores the room join
byte[] joinBuf = Encoding.ASCII.GetBytes(join);

Socket conn = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
conn.Connect(ip, port);

conn.Send(nickBuf, nickBuf.Length, SocketFlags.None);
conn.Send(userBuf, userBuf.Length, SocketFlags.None);
conn.Send(joinBuf, joinBuf.Length, SocketFlags.None);

(你在NICK之前有一个额外的空间 - 这可能会也可能不会破坏。)


除了:

您可能会发现使用TcpClient,StreamReader和StreamWriter访问底层套接字更容易 - 它们将它包装起来并为您处理缓冲区。然后,您可以逐行直接将响应读取到字符串中,并通过传递字符串来写入套接字。没有摆弄编码和缓冲区。

TcpClient client = new TcpClient("chat.freenode.net", 6667);
StreamReader reader = new StreamReader(client.GetStream());
StreamWriter writer = new StreamWriter(client.GetStream());

string recievedData = reader.ReadLine();

writer.WriteLine("NICK IKESBOT");
writer.Flush();