Это открытая кросс платформенная программа под 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
пробему в принципе нашел но решить не получается, заключается в следующем: вот код функции подключения: 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, в систему он загружен но в режиме ".отключен". Буду рад любой помощи)))
Пользуйся тегов code. Какое именно исключение возникает? Код (Text): unsigned long int ctl_cmd=1; //if (ioctlsocket(sockfd, FIONBIO, &ctl_cmd)!=0) return TNETWORK_ERR; Этот код в рабочей версии тоже закомментирован? Дело в том, что в данном случае для сокета "включается" неблокирующий режим, он не ждёт реального подключения к серверу, только отправляет пакеты. Хотя причиной исключения это тоже быть вряд ли может, т.к. дальше это учтено в таком коде: Код (Text): do { FD_ZERO(&wfds); FD_SET(sockfd, &wfds); sel_ret = select(sockfd+1, NULL, &wfds, NULL, &tv); } while (sel_ret<0 && WSAGetLastError()==WSAEINTR); И кстати, имей ввиду, что для *nix timeout задаётся в миллисекундах, а для windows в секундах. Тебе надо просто потрейсить данный код и внимательно понаблюдать за поведенияем.
Уже неделю пытаюсь разобраться с 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(); } }