Forum: PC-Programmierung Socket sendet anstatt zu empfangen


von Ampfing (Gast)


Angehängte Dateien:

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

von Peter (Gast)


Lesenswert?

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.

von Ampfing (Gast)


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

von Peter (Gast)


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.

von Ampfing (Gast)


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

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
Noch kein Account? Hier anmelden.