是否可以使用标准 GCC 库连接到 IRC?
我了解 IRC 协议是一个非常简单的 TCP 协议,它应该不会比连接到另一个控制台难多少。
但是,与只需要 IP 和端口的控制台连接相比,连接到 IRC 时,昵称和频道将是额外的要求。
谁能告诉我一个如何做到这一点的例子?
当然,这很容易实现!这是一个非常基本的 TCP 协议。
GCC 只是一个编译器(和一个链接器)。GCC 和 IRC 之间没有直接联系。
要连接到服务器并与之通信,您只需要sys/socket.h
; 我不会详细介绍,这里有很多关于服务器-客户端 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
现在我们需要发送三样东西PASS
:USER
和NICK
。
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
另一个重要的事情 - 有PING
和命令,所以如果你很长时间PONG
没有回答服务器,你就会断开连接。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!
请注意,a:
是消息本身之前的前缀。
我想这足以进入 IRC。您可以通过阅读IRC 协议本身来尝试其他所有内容,尝试使用telnet
ornc
然后开始使用基本套接字编写程序。