Ошибка в прокси сервере на C++

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by X-954377, 17 Jul 2011.

  1. X-954377

    X-954377 New Member

    Joined:
    23 Jun 2010
    Messages:
    25
    Likes Received:
    1
    Reputations:
    0
    Всем доброе время суток у меня вообщем такая проблема написал прокси сервер но при соединение 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
    }
    //==================================================================================================================================
    
    ПОМОГИ УЖЕ ВТОРОЙ ДЕНЬ НЕ МОГУ РАЗОБРАТЬСЯ.
     
  2. X-954377

    X-954377 New Member

    Joined:
    23 Jun 2010
    Messages:
    25
    Likes Received:
    1
    Reputations:
    0
    И ещё есть такая программка ICQMsgLoger она работает как прокси-сервер и сохраняет историю переписки вот если у кого есть исходники на нею то пожалуйста дайте для изучения.
     
  3. ЕгоАкк

    ЕгоАкк Banned

    Joined:
    21 Sep 2009
    Messages:
    84
    Likes Received:
    18
    Reputations:
    0
    С открытым кодом есть imspector и aimsniff, но они большие и под unix.

    Лучше откажись от асинхронного ввода/вывода и сделай на потоках. Так оно конечно не тру, зато проще.
    Еще нужно читать полный пакет, сначала заголовок (в нем содержится длина), а затем начинку. От тупой пересылки толку мало, ибо нужно менять адрес бос-сервера (чтобы потом клиент снова попал к нам, а не на бос-сервер), а потом выдирать сообщения.
     
  4. X-954377

    X-954377 New Member

    Joined:
    23 Jun 2010
    Messages:
    25
    Likes Received:
    1
    Reputations:
    0
    ТИпо если через мою прокси соединится аська то она всё равно автоматически перекинется на login.icq.com
     
  5. ЕгоАкк

    ЕгоАкк Banned

    Joined:
    21 Sep 2009
    Messages:
    84
    Likes Received:
    18
    Reputations:
    0
    Да. Ты почитай про протокол, посмотри пакеты в сниффере, иначе с таким подходом тебе ничего не светит.
     
  6. X-954377

    X-954377 New Member

    Joined:
    23 Jun 2010
    Messages:
    25
    Likes Received:
    1
    Reputations:
    0
    Нужно порыться...
     
  7. Jingo Bo

    Jingo Bo Member

    Joined:
    25 Oct 2009
    Messages:
    368
    Likes Received:
    51
    Reputations:
    7
    Протокол уже вроде убрали из паблика с офф сайта aol? А именно сообщения идут по самому жопному снаку 4/7 как щас помню, оп, там инфа очень устарела(нет плагинов и прочей приблуды), когда для нужд писал - очень много сидел со сниффером и HEX редактором. Получается тебе нужно сделать интерпретацию FLAP пакета, в нем SNAC данных и там перехватывать 4/7 SNAC, при этом типов сообщений там море(RTF, Plain, и т.д.), которые нужно расшифровывать. Проще сохраняй все данные.
    Почему асинхронный ввода/вывод тру?
     
    #7 Jingo Bo, 18 Jul 2011
    Last edited: 18 Jul 2011
  8. ЕгоАкк

    ЕгоАкк Banned

    Joined:
    21 Sep 2009
    Messages:
    84
    Likes Received:
    18
    Reputations:
    0
    Хватает неофициальных описаний http://forum.asechka.ru/showthread.php?t=126271

    Это про потоки, а не про асинхронный и/о.