www.mikrocontroller.net

Forum: PC-Programmierung Socket sendet anstatt zu empfangen


Autor: Ampfing (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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-... ). 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

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Ampfing (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

hm, leider nein.
Ich habe die Funktion SendAndReceive jetzt so implementiert:
private void SendAndReceive(byte[] cmd, ref byte[] response, uint anzBytes)
{
   m_Socket.Send(cmd);
   Int32 receivedBytes = 0;
   while (receivedBytes < anzBytes)
   {
      receivedBytes += m_Socket.Receive(response);
   }
}
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

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Ampfing (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.