2011-07-11 78 views
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. 
+0

我會添加一條評論:許多IRC服務器已經在1993年的RFC之外移動了很多方法,增加了偶爾記錄的各種功能和模式 - 但並非總是如此。可能沒有一個嚴格遵循RFC的主要IRC網絡。 – qid

回答

1

我猜,加入特定頻道,您的暱稱必須註冊與NickServ或同等的IRC服務。您可能需要註冊您使用的NickServ的暱稱(我建議使用普通的IRC客戶端來做到這一點,以使它更容易),然後從您的代碼中,PRIVMSG NickServ用某種auth命令「登錄「之前它會允許你加入該頻道。可能有一個通道模式控制是否允許非授權用戶加入。

如果你還沒有,我會建議使用一個空的,未註冊的頻道來做你的測試。它有助於控制測試環境,並且您在開發過程中沒有好奇的人試圖破壞您的軟件。