【问题标题】:Establishing a connection to IRC建立与 IRC 的连接
【发布时间】:2012-09-29 19:51:52
【问题描述】:

是否可以使用标准 GCC 库连接到 IRC?

我了解 IRC 协议是一个非常简单的 TCP 协议,应该不会比连接到另一个控制台困难多少。

但是,与只需要 IP 和端口的控制台连接相比,连接到 IRC 时,昵称和频道将是额外的要求。

谁能给我举个例子来说明这是怎么做的?

【问题讨论】:

  • 许多 IRC 客户端或服务器程序是用 C 编码的免费软件。您可以查看它们的代码。
  • 帮助不大。我希望仅使用标准库进行连接,我不想有依赖项。
  • @user1080390 Basile 并不是建议您依赖另一个 IRC 客户端的代码,只是您可以查看他们的源代码来激发您的灵感。如果您已阅读 protocol specification 并且您仍然不确定如何编写客户端代码,我相信查看另一个客户端会很有帮助!
  • “不应该更难” - 实际上,它更容易,至少如果你不想涉足 DCC 的东西。我猜你可能会从一些 Linux Sockets 教程开始,比如that one。要更熟悉 IRC 协议,您可以阅读它的规范 - RFC 1459,@Celada 在之前的评论中链接了它。

标签: c linux unix


【解决方案1】:

当然,这很容易实现!这是一个非常基本的 TCP 协议。

GCC 只是一个编译器(和一个链接器)。 GCC 和 IRC 之间没有直接联系。
连接服务器并与之通信,只需要sys/socket.h;就不详细说了,关于server-client linux C/C++程序的例子和教程很多。​​

让我们看看并尝试使用telnet(一个命令行 telnet 客户端程序)来理解 IRC 协议。

首先,我们需要建立与服务器的连接(假设它是irc.freenode.net,默认端口为6667):

$ telnet irc.freenode.net 6667

服务器回复:

:sturgeon.freenode.net NOTICE * :*** Looking up your hostname...
:sturgeon.freenode.net NOTICE * :*** Checking Ident
:sturgeon.freenode.net NOTICE * :*** No Ident response
:sturgeon.freenode.net NOTICE * :*** Couldn't look up your hostname

现在我们需要发送三个东西:PASSUSERNICK

PASS 是一个发送连接密码的命令。在公共服务器(没有任何密码)上,您可以发送PASS none

USER 是一个命令,它告诉服务器您的用户名、主机名和真实姓名。就像,当你 whois 某人时,你会看到 username@1.2.3.4 和他的“真实姓名”。客户端在建立连接后发送的数据。

NICK 是一个设置昵称的命令。当然服务器应该知道你的昵称,所以你也应该在连接后立即发送它!

所以,我们建立了连接。现在您必须发送这些命令,只需将它们输入 telnet:

PASS none
NICK sorandom29      
USER blah blah blah blah

哇哦,我们有答案了!

:lindbohm.freenode.net 001 sorandom29 :Welcome to the freenode Internet Relay Chat Network sorandom29

还有一点很重要——有PINGPONG 命令,所以如果你长时间不使用PONG 回答服务器,你就会断开连接。

让我们看看它是如何完成的。我们收到一个 PING 请求:

PING :lindbohm.freenode.net

然后用相同的参数回答它:

PONG :lindbohm.freenode.net

那么,您可能想知道如何加入频道。

JOIN #linux

是的,就是这样。

:lindbohm.freenode.net 470 sorandom29 #linux ##linux :Forwarding to another channel
:sorandom29!~blah JOIN ##linux
:lindbohm.freenode.net 332 sorandom29 ##linux :Welcome to ##Linux! Freenode's general Linux support/discussion channel.

另一个命令是PRIVMSG,它向频道或其他人发送一条实际消息:

PRIVMSG #linux :hello guys! i'm using telnet to connect to irc and that's such a stupid idea, i have to respond to PINGs manually!

所以#linux 上的每个人都会看到:

<sorandom29> hello guys! i'm using telnet to connect to irc and that's such a stupid idea, i have to respond to PINGs manually!

请注意,: 是消息本身之前的前缀。

我想这足以进入 IRC。阅读IRC protocol 本身,尝试使用telnetnc,然后开始使用基本套接字编写程序,您就可以尝试很多其他的东西。

【讨论】:

    猜你喜欢
    • 2012-06-11
    • 1970-01-01
    • 1970-01-01
    • 2013-11-10
    • 1970-01-01
    • 2017-01-26
    • 2016-07-08
    • 2023-03-28
    • 1970-01-01
    相关资源
    最近更新 更多