Guten Morgen
Ich stehe vor folgendem Problem: Ich muß per TCP 5 Informationen eines Servers abfragen. Dazu gibt es 5 verschiedene Nachrichten, die asyncron (timergesteuert) gesendet werden müssen. Die Serverantworten unterscheiden sich nur durch den Inhalt (es sind Meßwerte verschiedener Sensoren), am Format kann ich nicht erkennen, welches Response zu welchem Request gehört. Ich hab nun 3 Lösungsmöglichkeiten, die ich hier mal zur Diskussion stellen will, jede hat Vor- und Nachteile. Und vielleicht gibts ja noch eine 4. geniale Lösung...
1. Für jede einzelne Nachricht öffne ich ein Socket, sende mein Request und lausche an diesem Socket auf die Antwort, ist die da, schließe ich das Socket. Beim nächsten Request: open socket, connect, send, receive, close socket ... So bin ich sicher, daß ich die Antworten den Requests eindeutig zuordnen kann.
Nachteil: Es werden ständig Sockets geöffnet und geschlossen
Vorteil: einfaches timeout handling, kommt innerhalb eines Intervals keine Antwort, wird das Socket einfach geschlossen.
2. Ich öffne 5 Sockets - für jeden Nachrichtentyp eins - und sende die Requests abhängig von Typ über das entsprechende Socket. Erst mit Programmende werden die Sockets geschlossen.
Nachteil: Was passiert, wenn plötzlich ein paar Nachrichtentypen dazu kommen (vielleicht nichts bei cleverer Programmierung)?
Vorteil: antwortet der Server auf ein Request zu spät ist zwar die Reihenfolge der empfangenen Responses falsch, nicht aber die Zuordnung zum Request.
3. Ich öffne 1 Socket, erzeuge mir einen Nachrichtenpuffer, in den die zu sendenden Nachrichten entsprechend der Reihenfolge durch einen "Haupt"-Thread eingetragen werden. Ein anderer Thread durchsucht den Buffer nach dem nächsten zu sendenden Request, sendet und wartet auf die Antwort, erst wenn die da ist, nimmt er sich den nächsten Request vor. Auch hier wird erst mit Programmende das Socket geschlossen.
Vorteil: nur ein Socket - resourcensparend.
Nachteil: Es kann zu Nachrichtenverzögerungen kommen, was hier allerdings nicht wirklich stört. Schwieriges timeout handling: Kommt ein Response nicht, kann ich nicht ewig warten - ich werde die anderen Requests dann nicht los. Einfach 's nächste senden geht nicht, kommt die verspätete Antwort dann, wird sie dem falschen Request zugeordnet. Mögliche Lösung: bei Timeout Socket schließen und wieder öffnen.
Ich brauche nicht zu erwähnen, daß am Server natürlich nix geändert werden darf - ein "ordentliches" Nachrichtenformat würde die Sache vereinfachen... :(
Achja, das Programm muß unter Windows laufen, was vielleicht bei Variante 1 für Probleme sorgt. In einem ersten Versuch wird ein Programm (geschrieben als Consolenapplikation mit Delphi7), das nur open socket, connect, send, close socket macht, zum Speicherfresser. Windows (Delphi?) belegt offensichtlich für jedes geöffnete Socket Speicher, gibt den aber bei close socket nicht (gleich?) wieder frei.
Ich freue mich schon auf die Antworten bzw. auf eine rege Diskussion...
Danke,
Gruß Frank