Hallo zusammen, vorab, der gleiche Beitrag ist auch auf www.c-plusplus.de zu finden ( http://www.c-plusplus.de/forum/viewtopic-var-t-is-250361.html ). Ich hoffe einfach mal auf eine größere Mitleserschaft :-) Zu meinem Problem: Ich habe zwei Anwendungen, die über einen Socket kommunizieren sollen. Eine Anwendung (Server) ist in C++ geschrieben, die Andere (Client) in C#. Auf der Client-Seite habe ich den angehängten Minimalcode implementiert. Wenn ich das Programm mit einem Breakpoint versehe und im Einzelschritt durch die Zeilen 43 bis 47 steppe sehe ich mit einem Socket-Sniffer folgende Telegramme (C ist der Client, S der Server): C->S: 0x00 S->C: 0x00 C->S: 0x07 0x00 0x00 0x00 0x00 S->C: 0x00 0x00 C->S: 0x02 S->C: 0x00 Soweit alles in Ordnung (auch die Antworten vom Server). Wenn ich das Programm aber ohne Breakpoint durchlaufen lasse habe ich auf einmal folgende Telegrammfolge: C->S: 0x00 S->C: 0x00 C->S: 0x07 0x00 0x00 0x00 0x00 C->S: 0x02 <- FEHLER S->C: 0x00 <- Antwort auf Telegramm 0x02 S->C: 0x00 0x00 <- Antwort auf Telegramm 0x07 Der Client schickt also zwei Socket-Telegramme unmittelbar hintereinander ohne auf die Antwort des Servers zu warten. Das soll/darf nicht passieren. An der Serveranwendung kann es ja wohl schlecht liegen, die antwortet ja, aber der Client wartet die Antwort gar nicht erst ab, sondern schickt sofort ein zweites Telegramm. Was kann ich dagegen unternehmen? Danke vorab für jede Hilfe
das Problem wird sein, das du bei Socket.Receive nicht auf alle Daten wartest. Du musst schon das Return auswerten und warten bis alle Daten die die brauchst vorhanden sind.
Hi, hm, leider nein. Ich habe die Funktion SendAndReceive jetzt so implementiert:
1 | private void SendAndReceive(byte[] cmd, ref byte[] response, uint anzBytes) |
2 | {
|
3 | m_Socket.Send(cmd); |
4 | Int32 receivedBytes = 0; |
5 | while (receivedBytes < anzBytes) |
6 | {
|
7 | receivedBytes += m_Socket.Receive(response); |
8 | }
|
9 | }
|
Aufgerufen wird sie mit (gleiche buffer wie im ersten Post): SendAndReceive(buffer, ref response, 1); SendAndReceive(buffer2, ref response, 2); SendAndReceive(buffer3, ref response, 1); Ohne Breakpoint habe ich leider immer noch die gleiche Abfolge wie vorher Viele Grüße
dann lass dir doch mal anzeigen was er empfangen hat. Wenn es wirklich so ist wie du schreibst dann muss er auch etwas empfangen haben. Eventuell sind noch daten im Puffer die du vorher nicht abgerufen hast.
Hi Peter, das Ganze ist offensichtlich nur ein Darstellungsproblem des Listener-Programms. Das macht - wie ich schmerzlich erfahren musste - auch noch andere 'tolle' Dinge... Habe mein eigentliches Problem mittlerweile auch gefunden (es besteht nicht darin, dass sich Telegramme überholen würden...) und bin gerade dabei es zu beheben. Danke für Deine Hilfe und viele Grüße
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.