Autor Beitrag
Tobi482
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 135



BeitragVerfasst: Fr 24.11.06 21:01 
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^^.

ausblenden volle Höhe 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
EE-Regisseur
Beiträge: 5248
Erhaltene Danke: 2

WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
BeitragVerfasst: Fr 24.11.06 23:01 
Wie lautet denn die Fehlermeldung ;-)?

_________________
"Wer Ego-Shooter Killerspiele nennt, muss konsequenterweise jeden Horrorstreifen als Killerfilm bezeichnen." (Zeit.de)
Tobi482 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 135



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
EE-Regisseur
Beiträge: 5248
Erhaltene Danke: 2

WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
BeitragVerfasst: Sa 25.11.06 20:53 
Hast du auch en Host angegeben?

_________________
"Wer Ego-Shooter Killerspiele nennt, muss konsequenterweise jeden Horrorstreifen als Killerfilm bezeichnen." (Zeit.de)
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: 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

_________________
There are 10 types of people - those who understand binary and those who don´t.
Tobi482 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 135



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 135



BeitragVerfasst: Di 29.01.08 15:14 
Hab ganz vergessen diesen Thread zu beenden
Danke nocheinmal für eure Hilfe

Mit freundlichen Grüßen
Tobi