IRC套接字连接问题
Problem with IRC socket connection
在JOIN和USER期间发生错误,它告诉我需要"先注册"。三:PASS, NICK工作正确(可能)。你知道这怎么可能吗?我遵循了相关的RFC, https://www.rfc-editor.org/rfc/rfc1459#section-4.1
代码:#include <iostream>
#include <winsock2.h>
#include <string>
#include <cstring>
#include <fstream>
#pragma comment(lib, "ws2_32.lib")
using namespace std;
unsigned long resolveHost(const string &host){
LPHOSTENT entryHost = gethostbyname(host.c_str());
if(!entryHost){
unsigned int addr = inet_addr(host.c_str());
entryHost = gethostbyaddr((char*)&addr, 4, AF_INET);
if(!entryHost) return 0;
}
return *((int*)*entryHost->h_addr_list);
}
int main(){
WSADATA wsaData;
SOCKADDR_IN saddr;
SOCKET sock;
char buffer[1024*8] = {"0"};
string adres_hosta = "irc.example.com";
string sbuffer;
string nick = "johnsmith";
string kanal = "#channel";
string password = "p@55w0rd";
string auth = "/AuthServ auth johnsmith p@55w0rd";
WSAStartup(MAKEWORD(2, 2), &wsaData);
sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
saddr.sin_addr.S_un.S_addr = resolveHost(adres_hosta);
saddr.sin_port = htons(6667);
saddr.sin_family = AF_INET;
if(connect(sock, (sockaddr*)&saddr, sizeof(sockaddr)) == SOCKET_ERROR){
cout << "Nie udalo sie nawiazac polaczenia z " << adres_hosta << ".";
return 0;
}
recv(sock, buffer, 1024*8, 0);
cout << buffer << endl << endl << flush;
/*
1. Pass message
2. Nick message
3. User message
*/
sbuffer ="PASS " + password + "rn";
send(sock, sbuffer.c_str(), strlen(sbuffer.c_str()), 0);
recv(sock, buffer, 1024*8, 0);
cout << sbuffer.c_str() << endl << buffer << endl << endl;
sbuffer = "NICK " + nick + "rn";
send(sock, sbuffer.c_str(), strlen(sbuffer.c_str()), 0);
recv(sock, buffer, 1024*8, 0);
cout << sbuffer.c_str() << endl << buffer << endl << endl;
sbuffer = "USER " + nick + " " + adres_hosta + " " + nick + " :" + nick + "rn";
send(sock, sbuffer.c_str(), strlen(sbuffer.c_str()), 0);
recv(sock, buffer, 1024*8, 0);
cout << sbuffer.c_str() << endl << buffer << endl << endl;
sbuffer = "JOIN " + kanal + "rn";
send(sock, sbuffer.c_str(), strlen(sbuffer.c_str()), 0);
recv(sock, buffer, 1024*8, 0);
cout << sbuffer.c_str() << endl << buffer << endl << endl;
while(true){
recv(sock, buffer, 1024*8, 0);
cout << buffer << endl << endl;
if(buffer[0] == 'PING'){
sbuffer = "PONG :" + adres_hosta + "rn";
send(sock, sbuffer.c_str(), strlen(sbuffer.c_str()), 0);
cout << sbuffer.c_str() << endl << buffer << endl << endl;
}
}
return 1;
}
日志与连接:
NOTICE AUTH :*** Looking up your hostname
PASS p@55w0rd
NOTICE AUTH :*** Checking Ident
NOTICE AUTH :*** Found your hostname
NICK johnsmith
PING :229860947
Checking Ident
NOTICE AUTH :*** Found your hostname
USER johnsmith johnSmith test :johnSmith
NOTICE AUTH :*** No ident response
ICE AUTH :*** Found your hostname
JOIN #channel
:server.example.com 451 johnSmith johnSmith :Register first.
我猜,要加入那个特定的频道,您的昵称必须在NickServ或等效的IRC服务中注册。你可能需要注册你正在使用的昵称NickServ(我建议使用常规的IRC客户端这样做,使它更容易),然后,从你的代码,PRIVMSG NickServ与某种授权命令"登录"之前,它将允许你加入该频道。可能有一个通道模式来控制是否允许非授权用户加入。
如果你还没有,我建议使用一个空的,未注册的通道来做你的测试。它有助于控制测试环境,并且在您开发软件的过程中,不会有好奇的人试图破坏您的软件。
相关文章:
- 到连接组件算法的问题(递归)
- 使用 bfs 解决连接组件问题时得到错误的答案
- CMake 错误"源似乎不包含 CMakeLists.txt",路径/库连接问题
- 连接 MATLAB 和 Visual Studios 的问题
- Cesanta Mongoose - 连接到本地主机时出现问题
- 通过 COM 对象连接 x64 应用程序时出现问题
- Qt的新信号/时隙语法问题 - 连接到一个简单的函数
- 无线局域网连接问题
- C++ Qt SQL lite 数据库连接问题
- 在 Windows 问题上连接到企业 WiFi
- 我的字符串类的 += 运算符有问题,它没有正确连接字符串
- 与Mingw(V.4.3.0)和Libhid连接的问题
- 尝试创建表面网格,但遇到连接问题
- Qt - 在课堂上连接 - 出了点问题 - 这个
- 连接GLUT和QGLViewer的问题
- 从使用 emscripten 编译的 c++ 连接 websocket 时出现问题
- 闲置期后的redis pubsub连接问题
- 使用WebSocketpp启用了Websocketpp接受连接的问题
- 在Visual Studio 2017中连接NLOPT-2.4.2的问题
- QT中的TCP连接性能低问题