Irc 客户端识别协议 "No Ident repsonse"
Irc client Identify protocol "No Ident repsonse"
我的客户端无法连接到我正在尝试连接的 irc 服务器。我做了一些研究,它说我需要监听端口 113 并以某种格式响应服务器。我不确定该怎么做。当我在收到错误消息之前尝试这样做时。这是我尝试收听之前的代码。 irc 将消息发送到我的客户端 "No ident response"。我是否需要创建一个完全不同的 all together 来监听端口 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));
}
}
}
}
是的,您需要创建一个完全独立的端口来监听和响应身份请求
可以找到有关身份的更多信息here
尽管上面有@Saruman 的回答,但您无需创建身份服务器即可连接到大多数 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 之前有一个额外的 space - 这可能会或可能不会破坏东西。)
旁白:
您可能会发现使用 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();
我的客户端无法连接到我正在尝试连接的 irc 服务器。我做了一些研究,它说我需要监听端口 113 并以某种格式响应服务器。我不确定该怎么做。当我在收到错误消息之前尝试这样做时。这是我尝试收听之前的代码。 irc 将消息发送到我的客户端 "No ident response"。我是否需要创建一个完全不同的 all together 来监听端口 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));
}
}
}
}
是的,您需要创建一个完全独立的端口来监听和响应身份请求
可以找到有关身份的更多信息here
尽管上面有@Saruman 的回答,但您无需创建身份服务器即可连接到大多数 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 之前有一个额外的 space - 这可能会或可能不会破坏东西。)
旁白:
您可能会发现使用 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();