Entwickler-Ecke
Internet / Netzwerk - Connection-Index herausfinden
nuschii - Mi 11.12.02 19:43
Titel: Connection-Index herausfinden
Servus, Leudz!
Ähm, ich versuch grad mit TServerSocket und TClientSocket klar zu kommen. Eigentlich nicht mal so schwer... Aber:
Kann mir vielleicht jemand sagen, wie ich bei einem ServerSocket den Index der Connection herausfinde, die "Client-Ereignisse" wie OnClientDisconnect, OnClientError, OnClientRead usw. verursacht? Wäre mir eine große Hilfe, Danke!
see ya
Nuschii
[/code]
Delete - Fr 07.03.03 16:45
Hi
Das wüsst ich auch mal gerne.
So spontan würd ich sagen, einfach alle Sockets von TServerSocket mit deinem aktuellen vergleichen, wenn die Adresse gleich ist müssts wohl der gleiche sein.
Vielleicht kann uns das mal einer bestätigen? :?:
Udontknow - Fr 07.03.03 17:04
Hi!
Ja, diese Methode funktioniert. Aber aufgepasst: Wenn User 1 sich connected, dann ein User 2 kommt, und User 1 dann geht, befindet sich der Socket für User 2 plötzlich an Index 0!
Cu,
Udontknow
nuschii - Mo 10.03.03 23:53
Habe die Ehre!
Wow! Das mir echt noch jemand darauf antwortet, hätt ich nicht gedacht. Immerhin habe ich die Frage vor einem Viertel Jahr gestellt. Respekt! und Danke. Obwohl ich dass Problem nun anderweitig gelöst habe: Wenn ein Client etwas sendet, stellt er an den Anfang von SendText seine IP-Adresse, also z. B. "192.168.0.1 BEFEHL". Damit weiß der Server von wem die Nachricht kommt.
Jetzt aber habe ich ein neues (und viel viel schlimmeres Problem :( ):
Ich habe die Anwendung jetzt soweit, dass sie mit den Clients interagiert, d. h. über einen bestimmten Befehlssatz Anweisungen ausführt, Informationen an die Clients zurücksendet, etc. Das Problem ist, dass (vor allem bei mehreren Clients) während der Ausführung einer Anweisung innerhalb der OnClientRead-Routine bereits Daten nachströmen, die dann beim nächsten Aufruf von OnClientRead alle zusammen verarbeitet werden. Z. B. so:
Client1 sendet "BEFEHL1" => Server führt die entsprechende Aktion aus. !Währenddessen! senden Client2 und Client3 jeweils "BEFEHL2". Beim nächsten Aufruf von OnClient schaut Socket.ReceiveText so aus:
"BEFEHL2BEFEHL3"
Damit kann der Server dann gar nix mehr anfangen und verweigert zurecht den Dienst.
Wie kann ich also das Empfangen von Text solange "sperren", bis der Server wieder bereit ist (Und dass möglich ohne Hin- und Hersenden von "Warteanweisungen")??
see ya
Nuschii
O'rallY - Di 11.03.03 16:16
Das ist eine der größten Macken der Socketkompos. Ich fürchte du musst auf die Indys umsteigen. Aber die sind halb so schlimm :wink:
Udontknow - Di 11.03.03 16:24
Wieso ist das eine Macke? Man muss nur die einzelnen Blöcke auseinander halten können, dann ist das gar kein Problem.
Cu, :)
Udontknow
nuschii - Mi 19.03.03 19:32
Tag.
Naja, mit Streams und Indy und sowas möcht ich mich eigentlich gar nicht rumschlagen; ich bin ja froh, dass ich mittlerweile mit den Sockets einigermaßen zurechtkomme :wink:
Ich hab mich jetzt dafür entschieden, vor jeden String, der gesendet wird, die Länge zu setzen. Damit müsste sowohl Server als auch Client die einzelnen Strings auseinander halten können. Jedoch hat die Sache einen Haken: Die Methode ist leicht fehleranfällig. Ich meine, wenn jetzt irgendetwas im Server ankommt, was gar keinen Sinn macht (kann ja durchaus passieren), dann bleibt entweder alles stehen oder das Programm stürzt ab. Man müsste also eine Art "Notventil" schaffen, die eventuellen Datenmüll aussondert. Aber ich denk, das krieg ich auch noch hin :P
see ya
Nuschii
Dj_GL - Mi 19.03.03 22:38
Na wenn Du nur 2 Strings auseinanderhalten willst dann ist das ganze doch recht einfach ...
Du sendest einfach nach jedem string ein #10#13 dh einen Zeilenumbruch ...
Und am Server suchst Du nach diesem Zeilenumbruch und Du hast Deinen gesuchen String
Ich habe sehr viel Erfahrung mit TClientSocket und TServerSocket ...
Und wenn man deren Tücken kennt kann man die Probleme durch leichte Maßnahmen umgehen ...
Hoffe ich konnte helfen
MFG
Dj_GL
Dj_GL - Mi 19.03.03 22:43
Achja nochwas ...
zum Index herausfinden verwende mal diese Funktion:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| function TMainform.GetServerIndex(Socket:TCustomWinSocket;Server:TServerSocket):integer; var i,Index:integer; begin Index:=-1; for i:=0 to Server.Socket.ActiveConnections-1 do begin if Server.Socket.Connections[i].SocketHandle=Socket.SocketHandle then begin Index:=i; break; end; end; result:=Index; end; |
ist eindeutig sicherer als über die Remoteadress zu suchen
MFG
Dj_GL
nuschii - Di 01.04.03 16:46
Hi!
Danke für die Hilfe; die Methode mit Zeilenumbruch (ich denke die richtige Reihenfolge ist #13#10 aber das wird wohl egal sein) funktioniert tatsächlich. Und einfacher als ich dachte. (Vorausgesetzt man kennt wiederum die Tücken von copy und pos :wink: )
Sorry, dass ich mich so spät melde, aber ich programmiere das Teil im Informatik-Raum unserer Schule. Zu Hause hätte es auch wenig Wert, da ich es nicht mit vielen PCs im Netzwerk ausprobieren kann, und bei DER Internetverbindung (max. 28800kbps / >5 km bis zum nächsten Einwahlpunkt :( ) kann ich auch keinen Härtetest durchführen...
Also nächsten Montag wird die neue Methode im Info-Raum auf Herz und Nieren getestet. Erst dann gibts den nächsten Bericht.
see ya
Nuschii
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!