Всем доброе время суток у меня вообщем такая проблема написал прокси сервер но при соединение ICQ через него происходит разрыв подскажите что здесь ни так в общем вот сам листинг. main.h Code: #pragma once #include <Windows.h> #include <stdio.h> #pragma comment(lib,"Ws2_32.lib") //================================================================================================================================== #define CLASSNAME L"LogICQ" #define TITLENAME L"IcqLogDB" #define IN_PORT 5190 #define OUT_IP "205.188.251.47" #define OUT_PORT 5190 #define MAX_DATA 512 #define MAXCONN 1000 #define WM_ASYNC_CLIENTEVENT WM_USER+1 #define WM_ASYNC_PROXYEVENT WM_USER+10 //================================================================================================================================== SOCKET hListenSockTCP = INVALID_SOCKET; SOCKADDR_IN myaddrTCP,proxyaddrTCP; char buf[MAX_DATA]; SOCKET sockets[MAXCONN]; HWND hwnd; //================================================================================================================================== LRESULT CALLBACK WndProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam); VOID ConnectToProxy(SOCKET); //================================================================================================================================== main.cpp Code: #include "main.h" //================================================================================================================================== INT _stdcall WinMain(HINSTANCE hInst,HINSTANCE,LPSTR,INT){ WSADATA stWSADataTCPIP; if(WSAStartup(0x0101, &stWSADataTCPIP))MessageBox(0,L"WSAStartup error !",L"NET ERROR!!!",0); ZeroMemory(sockets,sizeof(sockets)); WNDCLASS wcl={CS_HREDRAW | CS_VREDRAW,(WNDPROC)WndProc,0,0,hInst,NULL,NULL,(HBRUSH)GetStockObject(WHITE_BRUSH),NULL,CLASSNAME}; if(!RegisterClass(&wcl)){MessageBox(NULL,L"Ошибка регистрации класса!!!",L"Error",MB_OK | MB_ICONERROR);return 0;} hwnd = CreateWindow(CLASSNAME,TITLENAME,WS_OVERLAPPEDWINDOW,0,0,300,200,NULL,NULL,hInst,NULL); if(!hwnd){MessageBox(NULL,L"Ошибка Создание окна!!!",L"Error",MB_OK | MB_ICONERROR);return 0;} ShowWindow(hwnd,SW_NORMAL); UpdateWindow(hwnd); hListenSockTCP = socket (AF_INET,SOCK_STREAM,0); myaddrTCP.sin_family = AF_INET; myaddrTCP.sin_addr.s_addr = htonl (INADDR_ANY); myaddrTCP.sin_port = htons (IN_PORT); if(bind(hListenSockTCP,(LPSOCKADDR)&myaddrTCP, sizeof(struct sockaddr))){MessageBox(hwnd,L"This port in use!",L"BIND TCP ERROR!!!",0);} if(listen(hListenSockTCP,5))MessageBox(hwnd,L"listen error!",L"ERROR!!!",0); WSAAsyncSelect (hListenSockTCP,hwnd,WM_ASYNC_CLIENTEVENT,FD_ACCEPT|FD_READ|FD_CLOSE); MSG msg; while(GetMessage(&msg,hwnd,0,0)){ TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; } //================================================================================================================================== LRESULT CALLBACK WndProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam){ WORD WSAEvent; INT i; DWORD currentsock; FILE *f; switch(uMsg){ case WM_CLOSE: case WM_DESTROY: PostQuitMessage(0);break; case WM_ASYNC_CLIENTEVENT: // Сообщения про события сокетов, подключенных к клиенту. currentsock = wParam; WSAEvent = WSAGETSELECTEVENT (lParam); switch(WSAEvent){ case FD_CLOSE: shutdown(sockets[currentsock],1); closesocket(currentsock); break; case FD_READ:// ПЕРЕНАПРАВЛЕНИЕ ДАННЫХ (redirect). Берем от клиента, посылаем на сервер. i=recv(currentsock, buf, MAX_DATA, 0); send(sockets[currentsock], buf, i, 0); // и отправляем... break; case FD_ACCEPT:ConnectToProxy(accept(hListenSockTCP,NULL,NULL));break; } break; case WM_ASYNC_PROXYEVENT: for(i=0;i<MAXCONN;i++)if(sockets[i]==wParam){currentsock=i;break;}// Найдем соответствующий дескриптор. WSAEvent = WSAGETSELECTEVENT (lParam); switch(WSAEvent){// Произошло подключение к удаленному хосту case FD_CONNECT: i=WSAGETSELECTERROR(lParam); if (i!=0){ shutdown(currentsock,1); closesocket(sockets[currentsock]); sockets[currentsock]=INVALID_SOCKET; } break; case FD_CLOSE:// Сервер нас отрубает ... shutdown(currentsock,1); closesocket(sockets[currentsock]); sockets[currentsock]=INVALID_SOCKET; break; case FD_READ:// Перенаправление данных клиенту i=recv(sockets[currentsock], buf, MAX_DATA, 0); send(currentsock,buf, i, 0); break; } break; default: return DefWindowProc(hWnd,uMsg,wParam,lParam); } return 0; } //================================================================================================================================== void ConnectToProxy(SOCKET nofsock){ SOCKADDR_IN rmaddr; rmaddr.sin_family = AF_INET; rmaddr.sin_addr.s_addr = inet_addr(OUT_IP); rmaddr.sin_port = htons (OUT_PORT); sockets[nofsock] = socket(AF_INET,SOCK_STREAM,0); if(INVALID_SOCKET == sockets[nofsock])MessageBox(0,L"INVALID_SOCKET",L"ERROR!!!",0); WSAAsyncSelect (sockets[nofsock],hwnd,WM_ASYNC_PROXYEVENT,FD_CONNECT|FD_READ|FD_CLOSE); connect (sockets[nofsock], (struct sockaddr *)&rmaddr,sizeof(rmaddr)); return; // Connect OK } //================================================================================================================================== ПОМОГИ УЖЕ ВТОРОЙ ДЕНЬ НЕ МОГУ РАЗОБРАТЬСЯ.
И ещё есть такая программка ICQMsgLoger она работает как прокси-сервер и сохраняет историю переписки вот если у кого есть исходники на нею то пожалуйста дайте для изучения.
С открытым кодом есть imspector и aimsniff, но они большие и под unix. Лучше откажись от асинхронного ввода/вывода и сделай на потоках. Так оно конечно не тру, зато проще. Еще нужно читать полный пакет, сначала заголовок (в нем содержится длина), а затем начинку. От тупой пересылки толку мало, ибо нужно менять адрес бос-сервера (чтобы потом клиент снова попал к нам, а не на бос-сервер), а потом выдирать сообщения.
ТИпо если через мою прокси соединится аська то она всё равно автоматически перекинется на login.icq.com
Да. Ты почитай про протокол, посмотри пакеты в сниффере, иначе с таким подходом тебе ничего не светит.
Протокол уже вроде убрали из паблика с офф сайта aol? А именно сообщения идут по самому жопному снаку 4/7 как щас помню, оп, там инфа очень устарела(нет плагинов и прочей приблуды), когда для нужд писал - очень много сидел со сниффером и HEX редактором. Получается тебе нужно сделать интерпретацию FLAP пакета, в нем SNAC данных и там перехватывать 4/7 SNAC, при этом типов сообщений там море(RTF, Plain, и т.д.), которые нужно расшифровывать. Проще сохраняй все данные. Почему асинхронный ввода/вывод тру?
Хватает неофициальных описаний http://forum.asechka.ru/showthread.php?t=126271 Это про потоки, а не про асинхронный и/о.