1
在JOIN和USER期間發生錯誤,它告訴我需要「先註冊」。三:PASS,NICK正確工作(可能)。任何想法如何可能?我已經按照相關的RFC,http://tools.ietf.org/html/rfc1459#section-4.1IRC套接字連接問題
代碼:
#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 = "[email protected]";
string auth = "/AuthServ auth johnsmith [email protected]";
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 + "\r\n";
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 + "\r\n";
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 + "\r\n";
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 + "\r\n";
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 + "\r\n";
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 [email protected]
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.
我會添加一條評論:許多IRC服務器已經在1993年的RFC之外移動了很多方法,增加了偶爾記錄的各種功能和模式 - 但並非總是如此。可能沒有一個嚴格遵循RFC的主要IRC網絡。 – qid