2015-04-05 5 views
0

Работала над созданием бота IRC в последнее время, и, хотя кажется, что подключается &, работа с большинством IRC-серверов, похоже, есть проблемы с IRC-сервером Twitch (irc.twitch.tv).Проблема с подключением к IRC-серверу

При подключении к другому серверу данные принимаются & отправлены без каких-либо проблем, однако с подключением триггера я не могу отправлять и получать данные.

Initialize:

Connection::Connection(char* server, int port, std::string nick, std::string pass) 
{ 
    fServer = server; 
    fPort = port; 
    fNick = nick; 
    fPass = pass; 
    fChanCount = 0; 

    clear_buffer(); 

    fSock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 

    cout << "Attempting to resolve host: " << fServer << endl; 
    fHost = resolve_host(fServer); 
    fSaddr.sin_addr.S_un.S_addr = fHost; 
    fSaddr.sin_port = htons(fPort); 
    fSaddr.sin_family = AF_INET; 

    cout << "Resolved to: " << fHost << endl; 
} 

Open Connection:

int Connection::Connect() 
{ 
    if (connect(fSock, (sockaddr*)&fSaddr, sizeof(fSaddr)) == SOCKET_ERROR) 
    { 
     cout << "Can't connect to " << fServer << endl; 
     return 0; 
    } 

    recv(fSock, fBuffer, 1024 * 8, 0); 

    cout << fBuffer << endl << endl << flush; 

    send_message("PASS " + fPass); 
    send_message("NICK " + fNick); 
    send_message("USER " + fNick + " 0 * :" + fNick); 

    return 1; 
} 

Очистка буфера:

void Connection::clear_buffer() 
{ 
    memset(fBuffer, 0, sizeof(fBuffer)); 
} 

Прием:

string Connection::receive_message() 
{ 
    clear_buffer(); 

    recv(fSock, fBuffer, 1024 * 8, 0); 

    return fBuffer; 
} 

Полностью тупик от того, что может быть причиной этого, может предоставить больше деталей, если это необходимо.

+0

Является ли 'fPass' пустым? IIRC некоторым IRC-серверам требуется 'PASS', чтобы содержать что-то, даже если сервер не требует пароля. В этом случае я поставил «нет» для пароля. – Galik

+0

Я передаю пароль так же, как и все остальное. – user3815037

+0

Используете ли вы настоящий пароль или токен OAuth? – szatmary

ответ

0

Ваше сообщение USER не похоже на запрос спецификации RFC2812.

3.1.3 User message 

     Command: USER 
    Parameters: <user> <mode> <unused> <realname> 

    The USER command is used at the beginning of connection to specify 
    the username, hostname and realname of a new user. 

    The <mode> parameter should be a numeric, and can be used to 
    automatically set user modes when registering with the server. This 
    parameter is a bitmask, with only 2 bits having any signification: if 
    the bit 2 is set, the user mode 'w' will be set and if the bit 3 is 
    set, the user mode 'i' will be set. (See Section 3.1.5 "User 
    Modes"). 

    The <realname> may contain space characters. 

    Numeric Replies: 

      ERR_NEEDMOREPARAMS    ERR_ALREADYREGISTRED 

    Example: 

    USER guest 0 * :Ronnie Reagan ; User registering themselves with a 
            username of "guest" and real name 
            "Ronnie Reagan". 

    USER guest 8 * :Ronnie Reagan ; User registering themselves with a 
            username of "guest" and real name 
            "Ronnie Reagan", and asking to be set 
            invisible. 

Возможно, это является причиной проблемы?

В противном случае я нашел, что некоторым серверам требуется пароль в сообщении PASS, даже если сервер не настроен на его выполнение. В таких случаях я отправляю:

PASS none 
+0

Я передаю пароль так же, как сервер/порт/пользователь, поэтому я не думаю, что это проблема. Я также попытался изменить сообщение USER, чтобы он соответствовал стандарту RFC2812, но без успеха. – user3815037

+0

@ user3815037 Функция 'clear_buffer()' заполняет буфер нулями? Также вы принимаете во внимание концы строк: LFCR («\ r \ n»)? – Galik

+0

clear_buffer() просто вызывает memset() в буфере и заполняет его нулями. Что касается отправки сообщений, он добавляет «\ r \ n» до конца. Кажется, он отлично работает на других серверах IRC, а не irc.twitch.tv. – user3815037

Смежные вопросы