eigenen ICQ-Proxy schreiben

Hallo,

ich habe es mir zur Aufgabe gemacht, einen kleinen Proxy zu schreiben, welcher beim Login aktiv sein soll.

Ich habe herausgefunden, dass beim Einloggen in ICQ beim Klick auf den Button "Verbinden" nicht sofort die Userdaten mitgeschickt werden, sondern erst mal der Server angepingt wird (wahrscheinlich um zu testen, ob eine Verbindung überhaupt möglich ist).
Daraus schließe ich, dass das ICQ-Programm dann solange wartet, bis es vom ICQ-Server eine Bestätigung bekommt.
Das stimmt auch, denn ich habe mal aus Spaß einfach eine "1" als Bestätigung zurückgeschickt, und ICQ gab eine Fehlermeldung aus, dass die Verbindung fehlgeschlagen ist.

Hier der Ablauf:
- Proxy wird hochgefahren und wartet auf eingehende Sockets
- Nun ändert man bei den Verbindungseinstellungen von ICQ den Server von "login.icq.com" auf "127.0.0.1" und loggt sich in ICQ ein
- der Proxy reagiert dann und pingt mit einem neuen Socket den ICQ-Server (login.icq.com) an
- nun wartet der Proxy, bis der ICQ-Server antwortet
- diese Antwort schickt der Proxy dann sofort an den ICQ-User weiter


Nun ist jedoch mein Problem, dass das ICQ-Programm auch nicht auf die von mir weitergeleitete ICQ-Server-Anwort reagiert, sondern weiterhin blockiert...wieso???

Ich hoffe mir kann jemand helfen!
Viele Grüße
Gapa
 
Wenn du schon angefangen hast das Programm zu schreiben, was ich nach
Code:
- Proxy wird hochgefahren und wartet auf eingehende Sockets
- Nun ändert man bei den Verbindungseinstellungen von ICQ den Server von "login.icq.com" auf "127.0.0.1" und loggt sich in ICQ ein
- der Proxy reagiert dann und pingt mit einem neuen Socket den ICQ-Server (login.icq.com) an
- nun wartet der Proxy, bis der ICQ-Server antwortet
- diese Antwort schickt der Proxy dann sofort an den ICQ-User weiter
so verstanden hab.

Wären die Sources mal ganz nett. sonst kann dir glaub ich keiner weiterhelfen.
 
code

Hallo,

hier etwas Code:

Header:
Code:
//Management.h

#ifndef MANAGEMENT_H
#define MANAGEMENT_H

#include <iostream>
#include "windows.h"
#include "winsock.h"

class Management
{
  private:
    WSADATA wsa;
    SOCKADDR_IN main, icq_server;
    long handle;
    SOCKET sock_main, sock_icq_server, sock_icq_client;
    char data_send[1000], data_receive[1000];

  public:
    Management();
    ~Management();
    void Start();
};

#endif

Cpp:
Code:
//Management.cpp

#include "Management.h"

using namespace std;

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//---Konstruktor---

Management::Management()
{
  memset(&wsa, 0, sizeof(WSADATA));
  memset(&main, 0, sizeof(SOCKADDR));
  memset(&icq_server, 0, sizeof(SOCKADDR));
  memset(&handle, 0, sizeof(handle));
  memset(&sock_main, 0, sizeof(SOCKET));
  memset(&sock_icq_server, 0, sizeof(SOCKET));
  memset(&sock_icq_client, 0, sizeof(SOCKET));
  memset(&data_send, 0, sizeof(data_send));
  memset(&data_receive, 0, sizeof(data_receive));

  main.sin_port = htons(5190);
  main.sin_family = AF_INET;
  main.sin_addr.s_addr = ADDR_ANY;
  //main.sin_addr.s_addr = inet_addr("127.0.0.1");

  icq_server.sin_port = htons(5190);
  icq_server.sin_family = AF_INET;
  icq_server.sin_addr.s_addr = inet_addr("64.12.161.153");
}

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//---Destruktor---

Management::~Management()
{
}

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//---Connect---

void Management::Start()
{
  handle = WSAStartup(MAKEWORD(2,2), &wsa);
  if(handle == SOCKET_ERROR)
  {
    cout << "Fehler! WinSock konnte nicht gestartet werden!\nZum Beenden ENTER druecken...";
    system("pause>nul");
   return;
  }
  cout << "WinSock gestartet!\n"; 
   
  sock_main = socket(AF_INET, SOCK_STREAM, 0);
  if(sock_main == INVALID_SOCKET)
  {
    cout << "Fehler! Main-Socket konnte nicht erstellt werden!\nZum Beenden ENTER druecken...";
    system("pause>nul");
   return;
  }
  cout << "Socket erstellt!\n";
   
  handle = bind(sock_main, (SOCKADDR*)&main, sizeof(SOCKADDR));
  if(handle == SOCKET_ERROR)
  {
    cout << "Fehler! Main-Socket konnte nicht an Server gebunden werden!\nZum Beenden ENTER druecken...";
    system("pause>nul");
   return;
  }
  cout << "Main-Socket wurde an Server gebunden!\n";
   
  handle = listen(sock_main, 10);
  if(handle == SOCKET_ERROR)
  {
    cout << "Fehler! Funktion 'listen' fehlgeschlagen!\nZum Beenden ENTER druecken...";
    system("pause>nul");
   return;
  }
  cout << "Server lauscht...\n";
   
  sock_icq_client = accept(sock_main, 0, 0);
  if(sock_icq_client == INVALID_SOCKET)
  {
    cout << "Fehler! Es konnte keine neue Verbindung eingegangen werden!\nZum Beenden ENTER druecken...";
    system("pause>nul");
   return;
  }

//////////

  cout << "Neue Verbindung akzeptiert!\n\n\n\nProtokoll:\n\n";

  sock_icq_server = socket(AF_INET, SOCK_STREAM, 0);
  if(sock_icq_server == INVALID_SOCKET)
  {
    cout << "Fehler! ICQ_Server_Socket konnte nicht erstellt werden!\nZum Beenden ENTER druecken...";
    system("pause>nul");
  }
  else
    cout << "Socket erstellt!\n";

  handle = connect(sock_icq_server, (SOCKADDR*)&icq_server, sizeof(SOCKADDR));
  if(handle == SOCKET_ERROR)
  {
    cout << "Fehler! Verbindung zum ICQ_Server fehlgeschlagen!\nZum Beenden ENTER druecken...";
    system("pause>nul");
   return;
  }

  cout << "Socket wurde mit ICQ_Server verbunden!";

  handle = recv(sock_icq_server, data_receive, 256, 0);
  if(handle == SOCKET_ERROR)
  {
    cout << "Fehler beim Empfangen von Datenpaketen!\nZum Beenden ENTER druecken...";
   return;
  }
  else if(handle == 0)
  {
    cout << "Gegenseite hat die Verbindung getrennt!\nZum Beenden ENTER druecken...";
   return;
  }
  data_receive[strlen(data_receive) + 1] = '\0';
  cout << "\nDaten wurden erfolgreich von ICQ_Server empfangen: " << data_receive;

  handle = send(sock_icq_client, data_receive, strlen(data_receive), 0);
  if(handle == SOCKET_ERROR)
  {
    cout << "Fehler beim Senden von Datenpaketen an ICQ_Client!\nZum Beenden ENTER druecken...";
   return;
  }

  cout << "\nDaten wurden erfolgreich an ICQ_Client gesendet: " << data_receive;

  handle = recv(sock_icq_client, data_receive, 256, 0);
  if(handle == SOCKET_ERROR)
  {
    cout << "Fehler beim Empfangen von Datenpaketen von ICQ_Client!\nZum Beenden ENTER druecken...";
   return;
  }
  else if(handle == 0)
  {
    cout << "ICQ_Client hat die Verbindung getrennt!\nZum Beenden ENTER druecken...";
   return;
  }
  data_receive[strlen(data_receive) + 1] = '\0';
  cout << "UserDaten: " << data_receive;
  system("pause>nul");
 return;
}

Main:
Code:
using namespace std;

int main(int argc, char *argv[])
{
  Management manager;
  manager.Start();
  system("pause>nul");
 return 0;
}

Hoffe auf Hilfe!
Gapa
 
Zurück
Oben