【问题标题】:Irc client Identify protocol "No Ident repsonse"Irc 客户端识别协议“无识别响应”
【发布时间】:2015-01-02 00:20:52
【问题描述】:

我的客户端无法连接到我尝试连接的 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));
            }   
        }
    }
}

【问题讨论】:

    标签: c# client protocols server irc


    【解决方案1】:

    尽管上面有@Saruman 的回答,但您不需要创建一个 ident 服务器来连接到大多数 IRC 网络(包括 freenode)。您可以完全忽略有关“No ident response”的错误。这是一种过时的技术,不再安全,只能在基于 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();
    

    【讨论】:

    • 对不起,如果这是一个不恰当的回应,但你是一个传奇!我已经尝试解决这个问题一个星期了!非常感谢!!!!!!
    • 您可能还想看看tools.ietf.org/html/rfc1459 - 它是 IRC 协议的规范 :)
    【解决方案2】:

    是的,您需要创建一个完全独立的端口来监听并响应 ident 请求

    更多关于ident的信息可以找到here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-24
      • 2021-06-03
      • 1970-01-01
      • 1970-01-01
      • 2022-10-04
      • 2011-03-17
      • 1970-01-01
      相关资源
      最近更新 更多