Entwickler-Ecke
Internet / Netzwerk - TCPServer SendLn kommt nicht an
NewMori - So 25.12.11 14:55
Titel: TCPServer SendLn kommt nicht an
Hallo,
ich habe vor ein paar Tagen JS WebSockets entdeckt und würde nun gerne einen einfachen Server dafür schreiben. Ich habe diesen soweit auch mit einem TTCPServer implementiert, welcher die Requests im OnAccept entgegen nimmt und auswertet. Wenn ich allerdings versuche mit dem ClientSocket, welcher im OnAccept übergeben wird, eine Antwort mit ClientSocket.SendLn(s,''); zurück zu schicken kommt nichts beim Client an. Meine Frage ist daher: Gibt es irgendwelche Eigenschaften, welche ich beim Server/Clientsocket zusätzlich setzen muss um die Antwort zurück zu schicken (auslesen des Clientsockets mittels Receiveln() funktioniert ja)
Edit: Bis jetzt habe ich im TCPServer LocalHost auf "localhost", LocalPort auf 8787 und BlockMode auf bmThreadBlocking gesetzt.
MfG
NewMori
BenBE - So 25.12.11 15:01
Wenn Client und Server auf unterschiedlichen Rechnern laufen (oder du NICHT unter Windows arbeitest, kannst Du mit Wireshark recht einfach dir die Verbindung anschauen, ob überhaupt was gesendet wird. Zusätzlich ist es immer auch sinnvoll zu schauen, dass man nicht gerade einen leeren Text versendet (auch wenn da noch ein Zeilenumbruch dazukommen dürfte). Und dann wäre da noch der Hinweis aus
Narses' Netzwerk-Tutorials bzgl. Protokollen: Man sollte sich genau anschauen, was man macht, um Datenblöcke unterscheiden zu können.
Ach ja, noch eine Notiz am Rande: Sockets sind i.d.R. gecacht und senden daher Daten nicht sofort, wenn man es nicht anfordert. Könnte also durchaus sein, dass deine Antwort noch beim Server im Cache des ClientSockets liegt. Entweder direkt noch nen Flush ausführen ODER den Nagle-Algorithmus testweise abschalten (aber wirklich nur zum Debugging!!!).
NewMori - So 25.12.11 16:18
Danke für die schnelle Antwort. Ich habe mir die Tutorials nochmals angeschaut, dort wird zwar ein TServerSocket verwendet aber ich konnte es portieren. Leider zeigt sich dort der gleiche Effekt: Die Daten kommen nicht an. Für die Klasse TTCPServer habe ich leider kein Flush gefunden, auch den Nagle-Algorithmus kann ich nicht abstellen. ClientSocket.BytesSent zeigt mir allerdings an, dass alles verschickt wurde. (Leider habe ich im Moment nur einen Rechner mit Windows zur Verfügung und kann nicht mit Wireshark testen).
Ich habe ClientSocket.remoteHost testweise auf 'localhost' gesetzt, woraufhin curl "empty reply from server" zurückgab (anstatt eine leere Zeile zu zeigen). Ich denke es liegt daran, dass ich den Socket nicht richtig einstelle. Leider habe ich nirgends eine Beschreibung gefunden, welche Werte gesetzt sein müssen damit Nachrichten wieder zurück geschickt werden können. Es wäre nett wenn jemand kurz erklären könnte welche Werte im Socket gesetzt werden müssen damit der Socket Daten zurück schicken kann.
jaenicke - So 25.12.11 16:30
Mein Problem ist schlicht, dass ich es nicht einfach mal testen kann. Wenn du ein Testprojekt usw. posten könntest, könnte ich es mir mal anschauen. Ich habe aber wenig Lust bzw. zu wenig Zeit um das dafür nachzubauen. ;-)
NewMori - So 25.12.11 16:43
@jaenicke das wäre super. Ich habe einfach mal Code und Exe gezipped angehängt. Bis jetzt macht der Server nicht viel, außer im OnAccept-Event den Request entgegen zunehmen und zu prüfen, ob es ein WebSocket Request ist. Dort wird dann dementsprechend eine Antwort erzeugt und mit SendLn verschickt.
bummi - So 25.12.11 17:18
Wenn ich mit Chrome anfrage bekomme ich wie erwartet : HTTP/1.0 501 Not implemented
NewMori - So 25.12.11 17:31
Stimmt :shock: . Damit hat sich dieses Problem wohl erledigt, vielen Dank an alle die sich die Mühe gemacht haben sich den Code anzuschauen. Ich rätsele zwar immer noch warum er es nicht gleich angezeigt hat, aber da jetzt alles läuft, hoffe ich hat sich das Problem erledigt.
Mfg
NewMori
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!