Entwickler-Ecke

Internet / Netzwerk - Problem mit Datensenden bei TCP-Verbindung


Yogu - Do 26.07.07 11:52
Titel: Problem mit Datensenden bei TCP-Verbindung
Warum kann ich per TCP keine Daten senden?[meta]TCP, CRLF, Senden, #13#10[/meta]

Lösung: Nach jedem zu Sendendem Text müssen die beiden Zeichen #13#10 hinzugefügt werden.

Hallo,


Ich mache schon ewig an diesem blöden Problem rum: Die Logindaten an den POP3-Server zu senden. Ich benutze die Komponente TTCP von ISP.
Mit einem kleinen Chat hat die Übertragung problemlos funktioniert, jetzt aber klappt das irgendwie nicht. Ich weiß nicht, ob die Daten zum Server kommen, jedenfalls antwortet dieser nicht.

Hier mal der Code:

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:
procedure TForm1.TCPDataArrival(Sender: TObject; bytesTotal: Integer);
var Data: OleVariant; Answer, Command: String;
begin
  if State = stConnected then
  begin
    TCP.GetData(Data, oleString, MaxLength);
    Answer := Data;
    if Answer[1] = '+' then
    begin
      State := stSendUser;
      Command := 'USER '+UserEdit.Text;
      Data := Command;
      TCP.SendData(Data);
      LogBox.Items.Add('Antwort:  '+Answer);
      LogBox.Items.Add('Befehl:    '+Command);
    end
    else
    begin     
      State := stError;        
      LogBox.Items.Add('Antwort:  '+Answer);
      LogBox.Items.Add('Fehler:     Konnte nicht mit '+TCP.RemoteHost+' verbinden.');
    end;
    Exit;
  end;
  if State = stSendUser then
  begin
    TCP.GetData(Data, oleString, MaxLength);
    Answer := Data;
    if Answer[1] = '+' then
    begin
      State := stSendPass;
      Command := 'PASS '+PassEdit.Text;
      Data := Command;
      TCP.SendData(Data);   
      LogBox.Items.Add('Antwort:  '+Answer);
      LogBox.Items.Add('Befehl:    PASS '+CharString('*', Length(PassEdit.Text)));
    end
    else
    begin
      State := stWrongUser;
      LogBox.Items.Add('Antwort:  '+Answer);
      LogBox.Items.Add('Fehler:     Benutzername falsch');
    end;
    Exit;
  end;
end;


Die Verbindung aufbauen und so klappt, auch die Wilkommens-Meldung wird gesendet. Dadurch wird dieses Ereignis ausgelöst, und ich sende die Login-Daten. Dann warte ich auf weitere OnDataArrival-Ereignisse, doch es kommt keines mehr.
Die Technik müsste eigentlich klappen, ich habe es in einer anderen Programmiersprache schon ausprobiert.

EXE-Datei testen [http://www.yogularm.de/df/mailservice01.exe]
Quellcode ansehen [http://www.yogularm.de/df/mailservice01.zip]

Danke schonmal,
Yogu

Edit: Falls ihr den Quellcode braucht, ich hab ihn mal als Link eingefügt. Oder warum wissen 10 Mitglieder nicht weiter?


Yogu - Fr 27.07.07 21:25

OK, wenn keiner die Antwort weiß, dann jetzt die Lösung:
Es liegt daran, dass die Daten nicht an den Server kommen. Jetzt ist nur noch das Problem, warum. In einem lokalen Austausch (von 127.0.0.1 zu 127.0.0.1) klappt alles, nur bei aufgebauten Verbindungen nach außen klappt es nicht.

Benutzt jemand TTCP und kann einen Quellcode zum Senden posten? Ich wäre sehr dankbar.

Was mir auch sehr helfen würde, wäre eine andere Komponente, beid der das besser klappt...


Yogu - Fr 27.07.07 22:49

So, jetzt habe ich es auch mit TClientSocket probiert, und ich komm immer noch nicht ans Datensenden.
Langsam verzweifel ich. Hat jemand eine Idee, woran das liegen könnte?


BenBE - Fr 27.07.07 23:01

Schau mal hier [http://www.delphi-library.de/topic_+eine+Datei+ueber+Sockets+verschicken_67648.html] bzw. hier [http://www.delphi-library.de/topic_Warum+gibt+es+kein+ReceiveStream+bei+den+Sockets_65367.html].


Yogu - Sa 28.07.07 13:21

Das Tutorial kann ich leider nicht durchmachen, ich habeim Moment nur Delphi 3.
Ich habe die EXE mal hochgeladen, kann das vielleicht mal jemand ausprobieren? Ich habe nämlich den Verdacht, dass das vielleicht nicht am Programm sondern an meinem PC liegt...
Obwohl alle anderen Internetprogramme reibungslos funktionieren :nixweiss:

TCP-Verbindung [http://www.yogularm.de/df/tcp.exe]

Kann das vielleicht jemand testen und dann einfach sagen, ob alles klappt oder nicht?


Narses - Sa 28.07.07 23:06

Moin!

user profile iconYogu hat folgendes geschrieben:
Kann das vielleicht jemand testen und dann einfach sagen, ob alles klappt oder nicht?

Wenn du den Quelltext der TClientSocket-Version ohne die EXE als ZIP hier in den Anhang stellst, dann schau ich´s mir mal an (hab aber "nur" D7pro, sollte dann damit auch funktionieren - bzw. bei Änderungen von mir weiß ich nicht, ob das auch unterhalb von D7pro klappt).

cu
Narses


Yogu - So 29.07.07 20:58

Natürlich, kann auch die Programmdateien hochladen, aber warum probierst du nicht einfach die EXE aus?

Programmdateien [http://www.yogularm.de/df/tcp.zip]
EXE-Datei [http://www.yogularm.de/df/tcp.exe]


Narses - So 29.07.07 23:29

Moin!

user profile iconYogu hat folgendes geschrieben:
warum probierst du nicht einfach die EXE aus?

Ich vermeide es, EXecutables auszuführen, wenn ich kann; besonders, wenn diese vom Autor bereits in Frage gestellt werden... :nixweiss:

Scheint zu schwer zu sein, hier was in den Anhang zu stellen... :? Also mach ich das mal für dich, damit man das Problem auch später noch nachvollziehen kann, wenn dein Server nicht online sein sollte. :|

Und hier ist dein "Problem": du schließt deine Kommandos nicht mit einem CRLF ab, wie in http://www.ietf.org/rfc/rfc1939.txt gefordert. :mahn: Konkret also: :idea:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
procedure TForm1.SendBtnClick(Sender: TObject);
begin
  RTFText := RTFText + #13'{\cf2 Client:  '+Edit.Text+' \par}';
  UpdateRTF;

  TCP.Socket.SendText(Edit.Text+#13#10);
  Edit.Text := '';
end;

"Kaum macht man´s richtig, geht´s!" :zwinker:

cu
Narses


Yogu - Mo 30.07.07 12:13

Danke, danke, danke, user profile iconNarses

Hab ich nicht gewusst, in BlitzBasic [http://www.blitzbasic.com] entfällt dieses, wird wahrscheinlich schon automatisch hinzugefügt. So klappt alles wunderbar!

Und warum ich die Dateien nicht in den Anhang stelle: Mein Server ist viel zu unterbelastet, da funktionieren die Downloads bestimmt mindestens doppelt so schnell. Aber ist eigentlich totzdem gut, auch ein Anhang zu erstellen.