проблема с icqkid2

Тема в разделе "WASM.NETWORKS", создана пользователем FireFace, 26 янв 2008.

  1. FireFace

    FireFace New Member

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    4
    Это открытая кросс платформенная программа под icq протокол, да еще и безплатная.

    В ней есть тестовый пример проэкт (он собран под -nix копиляторы). Подключив к VS2005 он нормально собрался и запустился, но работал не долго так как возникло исключение при установлении связи с сервером.
    проэкт находится в папке test.

    исключение возникает после выполнения функции :

    int t_connect(int sockfd, const struct sockaddr *serv_addr, socklen_t addrlen, int timeout)
    {
    int my_timeout = timeout;
    return t_connect(sockfd, serv_addr, addrlen, &my_timeout);
    }

    эта фукция находится в файле src\tnetwork.cpp;

    функция t_connect вызывается с int ICQKid2::directConnect(string ahost, int aport) находится в файле icqkid2.cpp

    int ICQKid2::directConnect(string ahost, int aport)
    {

    ................
    while ((conn_ret=t_connect(tmp_sock, (const struct sockaddr *)&addr, (socklen_t)sizeof(addr), 10))!=0)

    {
    onIdle();
    if (conn_ret!=TNETWORK_TIMEOUT)
    {
    CLOSE_SOCK(tmp_sock);
    return -1;
    }
    }
    ................
    }
    проэкт можно скачать здесь http://sourceforge.net/projects/icqkid2
    но прикреплю и свой, в моем уже есть прэкт под vs2005

    Очень прошу помочь ))
    или может кто то знает другие проэкты под icq8 - подскажите.

    Буду рад любой помощи)))
    icq: 454891796
     
  2. FireFace

    FireFace New Member

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    4
    пробему в принципе нашел но решить не получается, заключается в следующем:
    вот код функции подключения:
    int t_connect(int sockfd, const struct sockaddr *serv_addr, socklen_t addrlen, int * timeout)
    {
    if (*timeout<=0)
    return TNETWORK_ERR;

    timeb t1;
    ftime(&t1);

    unsigned long int ctl_cmd=1;
    //if (ioctlsocket(sockfd, FIONBIO, &ctl_cmd)!=0) return TNETWORK_ERR;
    ctl_cmd=0;
    int tt = connect(sockfd, serv_addr, addrlen);
    if (tt!=0)
    {
    if (WSAGetLastError()!=WSAEINPROGRESS && WSAGetLastError()!=WSAEALREADY && \
    WSAGetLastError()!=WSAEWOULDBLOCK && WSAGetLastError()!=WSAEINVAL)
    {
    ioctlsocket(sockfd, FIONBIO, &ctl_cmd);
    return TNETWORK_ERR;
    }
    }
    // Make poll in timeout currency
    fd_set wfds;

    struct timeval tv;
    tv.tv_sec=*timeout/1000;
    tv.tv_usec=(*timeout%1000)*1000;
    int sel_ret;
    do
    {
    FD_ZERO(&wfds);
    FD_SET(sockfd, &wfds);
    sel_ret = select(sockfd+1, NULL, &wfds, NULL, &tv);
    } while (sel_ret<0 && WSAGetLastError()==WSAEINTR);

    if (sel_ret<=0)
    {
    ioctlsocket(sockfd, FIONBIO, &ctl_cmd);
    if (sel_ret<0) return TNETWORK_ERR;
    if (sel_ret==0) return TNETWORK_TIMEOUT;
    }
    if (!FD_ISSET(sockfd, &wfds))
    {
    ioctlsocket(sockfd, FIONBIO, &ctl_cmd);
    return TNETWORK_ERR;
    }
    // Get return code
    int gso_ret = 0;
    socklen_t gso_ret_len = (socklen_t)sizeof(gso_ret);

    if (getsockopt(sockfd, SOL_SOCKET, SO_ERROR, (char *)(&gso_ret), &gso_ret_len)!=0)
    {
    ioctlsocket(sockfd, FIONBIO, &ctl_cmd);
    return TNETWORK_ERR;
    }
    if (gso_ret!=0)
    {
    ioctlsocket(sockfd, FIONBIO, &ctl_cmd);
    WSASetLastError(gso_ret);
    return TNETWORK_ERR;
    }
    // Make socket blocked

    if (ioctlsocket(sockfd, FIONBIO, &ctl_cmd)!=0)
    return TNETWORK_ERR;

    timeb t2;
    ftime(&t2);
    *timeout=((t2.time-t1.time)*1000+t2.millitm-t1.millitm);

    return 0;
    }
    после ее выполненения происходит исключение. если закоментировать функцию connect(...), то исключения нет. а значит Проблема наблюдается при вызове функции connect(...), после выполнения она возвращеет 0 (успешное завершение), но на самом деле это не так, потомучто она выполняется сравнительно быстро (меньше чем пол сек. а подключатся нужно к login.icq.com, хотя это конечно не показатель, (для сравнея я другой программой подключался на 127,0,0,1 - это выполнялось дольше)).
    библиотеки ws2_32.lib и winsock2.h подключены.
    установлен фаервол outpost, в систему он загружен но в режиме ".отключен".
    Буду рад любой помощи)))
     
  3. twgt

    twgt New Member

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    1.494
    [del]
    то, что посоветовал, сам не смог сделать :dntknw:
     
  4. W4FhLF

    W4FhLF New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2006
    Сообщения:
    1.050
    Пользуйся тегов code. Какое именно исключение возникает?

    Код (Text):
    1. unsigned long int ctl_cmd=1;
    2. //if (ioctlsocket(sockfd, FIONBIO, &ctl_cmd)!=0) return TNETWORK_ERR;
    Этот код в рабочей версии тоже закомментирован? Дело в том, что в данном случае для сокета "включается" неблокирующий режим, он не ждёт реального подключения к серверу, только отправляет пакеты. Хотя причиной исключения это тоже быть вряд ли может, т.к. дальше это учтено в таком коде:

    Код (Text):
    1. do
    2.   {
    3.     FD_ZERO(&wfds);
    4.     FD_SET(sockfd, &wfds);
    5.     sel_ret = select(sockfd+1, NULL, &wfds, NULL, &tv);
    6.   } while (sel_ret<0 && WSAGetLastError()==WSAEINTR);
    И кстати, имей ввиду, что для *nix timeout задаётся в миллисекундах, а для windows в секундах.

    Тебе надо просто потрейсить данный код и внимательно понаблюдать за поведенияем.
     
  5. Roboteck

    Roboteck New Member

    Публикаций:
    0
    Регистрация:
    22 авг 2008
    Сообщения:
    1
    Уже неделю пытаюсь разобраться с icqkid2, ничего неполучается, даже не компилируется, помогите пажалуса, я с C++ знаком всего пару месяцев и впервые столкнулся с использованием сторонних классов, непонимаю вообще как их правильно использовать.
    из папки include скопировал файлы common.h, icqkid2.h, icqkid2_constants.h в папку D:\Program Files\Microsoft Visual Studio 9.0\VC\include, дальше перепробовал множество вариантов из папки test, всевремя ошибки при компиляции.
    Может даже у когонибудь есть готовое решение для отправки и получения сообщений, больше ничего ненадо. Даже готов выложить 100 WMZ тому, кто сделает:

    icq->send(номер ICQ, сообщение);

    if (icq->get_messages())
    {
    while(message=icq->get_message())
    {
    otkogo=message->get_sender();
    text=message->get_text();
    }
    }
     
  6. _Andrey_

    _Andrey_ New Member

    Публикаций:
    0
    Регистрация:
    18 авг 2007
    Сообщения:
    8
  7. Com[e]r

    Com[e]r Com[e]r

    Публикаций:
    0
    Регистрация:
    20 апр 2007
    Сообщения:
    2.624
    Адрес:
    ого..
    ух, в какой-то момент я даже подумал что это не бототекст.