Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Сети > IRC - алгоритм постоянного коннекта


Автор: sOckets 27.8.2006, 18:35
Здравствуйте , в общем я пишу IRC бота , вроде бы я научился конектиться , отправлять сообщения, отвечать на ПИНГи сервера....но ! я не могу удержать коннект , то есть допустим я запустил у себя бота , он висит на канале , выполняет свои функции , и тут у меня модем переподключился , бах и бот пропал , приходиться перезапускать его....помогите написать алгоритм постоянного коннекта.
Вот что я использую , скажите правильно или нет (хотя не пашет =\)
Код

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{
    while (1)
    {
        while(CONNECTED==false) CONNECT_TO_SERVER();                // Соединяемся с сервером
        RESTART_GET_();                                            // Читсим буфер приёма
        RESTART_POST_();                                            // Чистим буфер отпавки
        ADMIN=false;                                                    // Пока админа у нас нету
        recv(S, RESIVE, 1024, 0);                                            // Получаем данные от сервера
        IFPING(RESIVE);                                                // Если это PING то отвечаем
        ISADMIN();                                                    // Проверяем права админа
        if (ADMIN==true) 
        {
            strcpy(COMMAND,strstr(RESTART_GET_,"PRIVMSG ")+(11+strlen(CHANNEL)));// выдёргиваем команду
        }
        exec_cmd(COMMAND);                                                // выполняем команды
    }
return 0;
}



Автор: sOckets 27.8.2006, 21:37
модеры удалите дубликат темы , "интернет заглючил" у меня... smile 

Автор: sOckets 28.8.2006, 00:19
Код

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{
    while (1)
    {
    while(InternetGetConnectedState(&connected_to_inet, 0) == FALSE) {
        Sleep(50000);
    }
        while(CONNECTED==false) CONNECT_TO_SERVER();                // Соединяемся с сервером
        RESTART_GET_();                                            // Читсим буфер приёма
        RESTART_POST_();                                            // Чистим буфер отпавки
        ADMIN=false;                                                    // Пока админа у нас нету
        recv(S, RESIVE, 1024, 0);                                            // Получаем данные от сервера
        IFPING(RESIVE);                                                // Если это PING то отвечаем
        ISADMIN();                                                    // Проверяем права админа
        if (ADMIN==true) 
        {
            strcpy(COMMAND,strstr(RESTART_GET_,"PRIVMSG ")+(11+strlen(CHANNEL)));// выдёргиваем команду
        }
        exec_cmd(COMMAND);                                                // выполняем команды
    }
return 0;
}

Автор: bel_nikita 28.8.2006, 00:30
а что за константы такие CONNECTED и др?

Автор: sOckets 28.8.2006, 00:34
CONNECT_TO_SERVER(); если не подключает то делает CONNECTED=FALSE; изначально CONNECTED=FALSE;

Автор: sOckets 1.9.2006, 18:12
Вопрос не решён. Если обрываеться связь с инетом , программа всё равно весит на RECV smile как решить ?

Автор: 0x00 6.9.2006, 11:35
такой алгорит написать нельзя!!! т.к. ирц сервер, на котором висит твой бот отправляет ему PING на что твой бот должет ответить PONG, и если твой бот на него не ответит, то сервер посчитает, что он не в сети и сам отключит его...

Автор: sOckets 6.9.2006, 18:29
умник
Код

IFPING(RESIVE);                                                // Если это PING то отвечаем

Это я для кого написал ? Ты думаешь я не знаю IRC RFC ?

Автор: Artemon 6.9.2006, 19:04
Неблокирующие сокеты лучше не использовать.
Лучше всего в отдельном потоке организуй с помощью select таймаут.

вот ф-ии для реализации TimeOut

Код

  bool MySocket::TimeOutRead(DWORD MiliSec)const
{
  if( !S ) return true;

  int rc;

  fd_set  readfd;
  timeval tv;

  FD_ZERO( &readfd );
  FD_SET ( S, &readfd );

  tv.tv_sec  = MiliSec/1000;
  tv.tv_usec = 0;

  rc = select( NULL, &readfd, NULL, NULL, &tv );
  if ( rc <= 0 ) return true; // -1 error, 0 - timeout
  else           return false; // OK
}
//---------------------------------------------------------------------------
  bool MySocket::TimeOutWrite(DWORD MiliSec)const
{
  if( !S ) return true;

  int rc;

  fd_set  writefd;
  timeval tv;

  FD_ZERO( &writefd );
  FD_SET ( S, &writefd );

  tv.tv_sec  = MiliSec/1000;
  tv.tv_usec = 0;

  rc = select( NULL, NULL, &writefd, NULL, &tv );
  if ( rc <= 0 ) return true; // -1 error, 0 - timeout
  else           return false; // OK
}

Автор: sOckets 6.9.2006, 19:47
Мне посоветовали юзать неблокирующие.

Автор: Artemon 7.9.2006, 06:48
Я не говорю что их вообще нельзя использовать, я говорю, что лучше на мой взгляд использовать блокирующие по следующей причине:

1) Ты с клиента послал на сервер число типа DWORD, но из-за низкой скорости сети пришла только первая часть WORD, как ты будешь получать вторую часть? (конечно это можно реализовать, но опять повторюсь, лучше использовать блокирующие сокеты).

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)