- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在编写一个 IRC 客户端,我想连接到 irc.hackerzvoice.net。我已阅读RFC1459以及 Stackoverflow 上的类似帖子,但仍然不明白我的代码中可能存在什么问题。发送 NICK 和 USER 消息后,我仍然遇到相同的“注册超时”错误。
La socket 280 est ouverte en TCP/IP.
Connexion a 212.83.153.145 sur le port 6667
68 octets ont ete recus
texte recu : :irc.hackerzvoice.net NOTICE Auth :*** Looking up your hostname...
16 octets envoyes au serveur
texte envoye : NICK parallel
.30 octets envoyes au serveur
texte envoye : USER parallel * * :parallel
.99 octets ont ete recus
texte recu : :irc.hackerzvoice.net NOTICE Auth :*** Found your hostname (catv-89-132-88-100.catv.broadband.hu)
92 octets ont ete recus
texte recu : ERROR :Closing link: (unknown@catv-89-132-88-100.catv.broadband.hu) [Registration timeout]
d.hu)
0 octets ont ete recus
texte recu : ERROR :Closing link: (unknown@catv-89-132-88-100.catv.broadband.hu) [Registration timeout]
d.hu)
这是我的代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "root_me_1.h"
int main()
{
// Si la plateforme est Windows
#if defined (WIN32)
WSADATA WSAData;
WSAStartup(MAKEWORD(2,2), &WSAData); // sert à initialiser la bibliothèque WinSock
#endif
// socket et interface de connexion
SOCKET sock;
SOCKADDR_IN sin; // structure
char buffer[TAILLE_MAX] = "";
int nOctetsRecus = 0;
int nOctetsEnvoyes = 0;
int tailleBuffer = 0;
int boucle = 1;
// on crée une socket utilisant protocole TCP/IP
sock = socket(AF_INET, SOCK_STREAM, 0);
if(sock == INVALID_SOCKET)
printf("Erreur, socket non valide");
printf("La socket %d est ouverte en TCP/IP.\n", sock);
// on configure l'interface de connexion
sin.sin_addr.s_addr = inet_addr("212.83.153.145"); // adresse IP du serveur IRC
sin.sin_family = AF_INET;
sin.sin_port = htons(PORT); // sin_port et sin_addr doivent être en Network Byte Order // htons() convertit un entier court depuis l'ordre des octets de l'hôte vers celuidu réseau (host to network short)
if(connect(sock, (SOCKADDR*)&sin, sizeof(sin)) != SOCKET_ERROR) // si le client réussit à se connecter au serveur
printf("Connexion a %s sur le port %d\n", inet_ntoa(sin.sin_addr), htons(sin.sin_port));
else
printf("Erreur de connexion.");
// on reçoit les données envoyées par le serveur
nOctetsRecus = recv(sock, buffer, TAILLE_MAX, 0);
if(nOctetsRecus != SOCKET_ERROR)
{
printf("%d octets ont ete recus\n", nOctetsRecus);
printf("texte recu : %s", buffer);
}
else
printf("Les donnees n'ont pas ete recues");
// le client envoie des données au serveur
sprintf(buffer, "NICK parallel\r\n");
tailleBuffer = strlen(buffer)+1; // taille de la chaine + '\0'
nOctetsEnvoyes = send(sock, buffer, tailleBuffer, 0);
if(nOctetsEnvoyes != SOCKET_ERROR)
{
printf("%d octets envoyes au serveur\n", nOctetsEnvoyes);
printf("texte envoye : %s", buffer);
}
else
printf("Erreur : donnees non envoyees au serveur");
// le client envoie des données au serveur
sprintf(buffer, "USER parallel * * :parallel\r\n");
tailleBuffer = strlen(buffer)+1; // taille de la chaine + '\0'
nOctetsEnvoyes = send(sock, buffer, tailleBuffer, 0);
if(nOctetsEnvoyes != SOCKET_ERROR)
{
printf("%d octets envoyes au serveur\n", nOctetsEnvoyes);
printf("texte envoye : %s", buffer);
}
else
printf("Erreur : donnees non envoyees au serveur");
// on reçoit les données envoyées par le serveur
nOctetsRecus = recv(sock, buffer, TAILLE_MAX, 0);
if(nOctetsRecus != SOCKET_ERROR)
{
printf("%d octets ont ete recus\n", nOctetsRecus);
printf("texte recu : %s", buffer);
}
else
printf("Les donnees n'ont pas ete recues");
// on ferme la connexion
closesocket(sock);
#if defined (WIN32)
WSACleanup(); // libère les ressources allouées par la fonction WSAStartup()
#endif
getchar();
return EXIT_SUCCESS;
}
你知道这个问题吗?
谢谢。
最佳答案
这就是问题
sprintf(buffer, "NICK hoeplem\r\n");
tailleBuffer = strlen(buffer)+1;
因为 strlen(buffer) + 1
相差一个字节(不应发送 null
终止符 '\0'
到服务器,strlen()
返回字符串的长度(不包括null
终止符。)字符串的实际长度。如果服务器读取该字节,它可能会期望'\r\n'
刷新缓冲区并处理命令,因此它会在最后一个“命令”之后永远等待。
应该是
tailleBuffer = sprintf(buffer, "NICK hoeplem\r\n");
这样就完美了。
您可能还想检查POSIX's dprintf()
和/或推出您自己的 dprintf()
以避免每次都使用 sprintf()
。
此外,最好将每个命令作为一个带有参数的函数,并为每个可能的命令简单地调用 command_X(sock, PARAMETERS ...)
,这样你的代码会更简洁稳健。
关于c - 如何使用 C 语言的套接字将客户端连接到 IRC 服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46142285/
基于浏览器的 irc 客户端是否可以在不使用任何网关的情况下工作,即直接与 irc 服务器通信? 最佳答案 HTML5 WebSocket 无法连接到非 WebSocket 服务器。使用 WebSoc
已关闭。这个问题是 off-topic 。目前不接受答案。 想要改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 已关闭11 年前。 Improve th
在我的 IRC Bot 中,有一些命令我希望只能由我使用,并且我想检查以确保使用我的名字的任何人都被识别为 nickserv (idented)。但是,我无法找到一种简单的方法来确定这一点,这就是我在
我想在我的网站上实现聊天服务,想知道如何从头开始创建一个简单的基于浏览器的 IRC 客户端? 我有一个 linux box,可以在上面安装任何我想要的东西。 Google 找到了关于如何设置 IRC
我希望能够在不加入 IRC channel 的情况下从 IRC channel 获取用户列表及其详细信息,从而增加其用户数量。 所以不要发出 JOIN #chan然后 NAMES #chan要获取用户
关闭。这个问题是off-topic .它目前不接受答案。 想改善这个问题吗? Update the question所以它是 on-topic对于堆栈溢出。 8年前关闭。 Improve this q
我正在尝试编写我自己的 IRC 服务器。我引用的是 IRC RFC,但它让我有点困惑。如果我严格遵守 RFC,我认为任何流行的客户端都不会与我的服务器一起工作,比如 mIRC。例如,RFC 规定服务器
我正在使用标准库中的 TcpStream 开发一个 IRC 机器人。 我能够阅读输入的所有行,但 IRC 服务器似乎没有响应我的身份请求。我以为我发送请求的时间太早了,所以我尝试在发送 IDENT 之
我想连接到 ExIrc 中的两台服务器使用 Elixir ,我找不到一个简单的解决方案。我对 elixir 还很陌生,我能做的就是使用“伞”来运行两个应用程序并使它们相互连接? (我想用一个应用程序连
这个数字不是 RFC 1459 的一部分,但我希望能够使用它以便在 IRC 机器人中正确堆叠和取消堆叠模式。有没有不发送这个的主流 IRC 服务器? 最佳答案 这是规范的可选建议,这意味着编写客户端的
我对此进行了广泛的搜索,只找到了特定于机器人的客户端。我知道它们基本相同,但是对于我想做的事情,我就是想不通。 我正在尝试编写一个 python 客户端,它表面上是纯粹而简单的。例如,当从命令行运行时
我正在使用 net.Socket 模块连接到 EFNET 并测试我的代码,以便向我的机器人添加重新连接事件。 我可以通过哪些方式来模拟机器人断开连接?问题是 2-3 周后就会断开连接 - 我添加了事件
require "socket" server = "irc.rizon.net" port = "6667" nick = "Ruby IRC Bot" channel = "#0x40" s =
我正在尝试编写一个函数,使用 Twisted Python 将 IRC channel 中的昵称列表打印到该 channel 。我该怎么做呢?我已经阅读了 API 文档,并且在该站点上只看到一个与我的
我有一个命令,我想将其限制在某些级别。我正在使用 unreal3.2.6 IRC。 我读到这个: 但我仍然不确定我可以做些什么来检查用户排名。 我想看看用户是否是“语音”或更高级别。什么可以查找用户,
我正在计划建立一个 IRC 网络并一直在探索各种选择。我打算使用Inspircd IRC Server 。以及运行 meteor 的网络服务器。是否可以使用 websockets 构建一个 Web I
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 想改进这个问题?将问题更新为 on-topic对于堆栈溢出。 8年前关闭。 Improve this qu
如何获得 Weechat 配置变量?例如,我可以设置配置: /set irc.servers.freenode.ssl on 如何检索我设置的值? 最佳答案 要检查配置变量的值,您可以这样做: /se
有没有办法告诉irssi我要自动加入当前打开的所有 channel ? 我想要类似的东西: /channel add -auto /save 最佳答案 我找到了答案here: /alias adda
我整天都在搜寻Google,并且正在寻找一种方法来编写具有不同颜色的文本,就像我在其他IRC channel 上经常看到的那样。我想通过基于CLI的irssi实现此目的。我发现了多种无法正常工作的方法
我是一名优秀的程序员,十分优秀!