Socket sendet anstatt zu empfangen

Gast #1415927
Lesenswert?

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
Angehängte Dateien:
Gast #1415950
Lesenswert?

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
Gast #1415957
Lesenswert?

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.
Gast #1416245
Lesenswert?

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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren