Entwickler-Ecke

Internet / Netzwerk - Eigener Proxy - Anfänger


Tobi482 - Fr 24.11.06 21:01
Titel: Eigener Proxy - Anfänger
Hi Leute,

mit Delphi bin ich eigentich sehr bewandert, nur mit den TCP/IP Objekten bin ich blutiger Anfänger.

Ich wollte gerne einen Proxy-Server bauen der Pakete stumpf an eine beliebige IP umleitet. Leider taucht ein Fehler auf den ich mir nicht erklären kann.

Bitte schaut euch meinen Code an. Es ist sicherlich ein Verständnisproblem in der Funktionsweise der Sockets.

PS: mit den Winsocks (VB6) hatte ich nie Probleme. Ich denke mein Fehler ist das ich die Sockets in Delphi wie einen Winsock benutzte^^.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
procedure Tmain.FormCreate(Sender: TObject);
begin
     server.Port := 1000;
     server.Open;
     Addlog('Proxy listen');
end;

procedure Tmain.serverClientConnect(Sender: TObject; Socket: TCustomWinSocket);
begin
     Addlog('Client hat sich verbunden');

     client.Address := 'xxx.xxx.xxx.xxx';
     client.Port := 1000;
     client.Open;
end;

procedure Tmain.serverClientRead(Sender: TObject; Socket: TCustomWinSocket);
var
     msg       : string;
begin
     msg := Socket.ReceiveText;

     //Warte bis Partnerverbindung aufgebaut ist (verhindert durch Firewall etc. )
     while server.Active = false do
     begin
          sleep(100);
          Application.ProcessMessages;
     end;

     addlog('proxy->server');
     client.Socket.SendText(msg);
end;

procedure Tmain.clientRead(Sender: TObject; Socket: TCustomWinSocket);
var
     msg       : string;
begin
     msg := Socket.ReceiveText;

     while client.Active = false do
     begin
          sleep(100);
          Application.ProcessMessages;
     end;

     addlog('proxy->client');
     Server.Socket.SendText(msg);
end;


Die Fehler tauchen gleich beim ersten oder zweiten ClientRead oder ServerClientRead auf und immer in der letzten Zeile, also beim senden an die Partnerverbindung.

schon einmal herlzichen Dank im Voraus

Mit freundlichewn Grüßen
Tobi


GTA-Place - Fr 24.11.06 23:01

Wie lautet denn die Fehlermeldung ;-)?


Tobi482 - Sa 25.11.06 20:27

Fehler:

weiß gerade nicht den genauen wortlaut, ist aber so ähnlich wie

API Fehler: "send" bzw "recv" wurde ausgeführt (ws2_32.dll) mit leerem Host Paramter

Gruß Tobi


GTA-Place - Sa 25.11.06 20:53

Hast du auch en Host angegeben?


Narses - Sa 25.11.06 21:41

Moin!

Da deine Problembeschreibung recht "dürftig" ist, nur etwas zum grundsätzlichen Konzept:

Du verwendest die Socket-Komponenten wie Blocking-Sockets, aber arbeitest mit Ereignissen. :? Das ist nicht so gut geplant. Entweder zu schaltest die Sockets in den Blocking-Mode und arbeitest mit Threads, oder du verwendest die Ereignisse und reagierst entsprechend darauf. Konkret meine ich die Warteschleifen mit dem Sleep und dem ProcessMessages, das ist sehr unsauber. ;)

cu
Narses


Tobi482 - So 26.11.06 10:08

Ok hier nochmla der genau Fehler

Fehler:
"Windows-Socket-Fehler: Eine Anfprderung zum Senden oder Empfangen von Daten wurde verhindert, da der Socket nicht verbunden ist und (beim Senden über einen Datagrammsocket mit einem sendto-Aufruf) keine Adresse angegeben wurde (10057), auf API 'send'"

wenn ich mich nicht irre ist das doch ein Fehler der von den Basisbefehle kommt die die Socket Komponente verwaltet.

@Narses die schleifen sind nur aus einem grund da. Wenn die zu rootende Anwendung sich auf den Proxy connected, denkt diese, dass sie schon mit dem original server verbunden sei und fängt an munter Daten zu senden. Der proxy baut die verbindung zum original server erst dann auf, wenn sich jemand auf ihn conncted. Dabei macht eine Firewall immer die meldung "wollen sie xyz wirklich durchlassen?". Ich denke, dass wenn jetzt schon versurch werden würde daten zu senden, diese Pakete verloren gehen. Würde ich den Proxy früher verbinden trennt der originla Server die verbindung, wenn nicht nach kurzer (sehr kurzer) Zeit Daten kommen.
Wenn du eine andere möglichkeit kennst, ich bin für jede Hilfe offen^^

Gruß Tobi


Tobi482 - Di 29.01.08 15:14

Hab ganz vergessen diesen Thread zu beenden
Danke nocheinmal für eure Hilfe

Mit freundlichen Grüßen
Tobi