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?
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!
Yogu 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
Narses - So 29.07.07 23:29
Moin!
Yogu 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,
Narses
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.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!