Frage zu WinSock2 und Sockets



  • Dieser Beitrag wurde gelöscht!


  • Warum sollte man das wollen?



  • Du kannst den Socket auf non-Blocking schalten, und dann so lange recv() aufrufen bis du nen EWOULDBLOCK Fehler bekommst.
    Falls es das ist was du willst - also sicherstellen dass keine Daten mehr im Empfangspuffer stehen.

    Ansonsten beschreib besser was du willst. "Clear" Funktion kann je nach Kontext viel heissen - was du als "natürliche" Semantik für die Clear-Funktion eines Sockets annimmst können wir ja nicht wissen.



  • Dieser Beitrag wurde gelöscht!


  • Ich verstehe deine Beschreibung nicht.
    Schreib das bitte nochmal mit verständlichem Satzbau und korrekter Grammatik, und vor allem mit dem üblichen Vokabular.



  • Dieser Beitrag wurde gelöscht!


  • Sockets mit TCP sind Stream-basiert, d.h die Applikation muss wissen wann eine Meldung komplett ist (und auch wann noch nicht). D.h. du musst in deinem Programm erkennen wann das File komplett übertragen ist, und dann eine neue Meldung empfangen ("fertig"). Ev. hilft es wenn du deinen Empfangscode (oder Teile davon) hier zeigst.

    Ein bisschen Interpunktion und die Vermeidung von das/dass-Fehler sowie die Beachtung von Gross-und Kleinschreibung hilft dem Leser deines Posts ungemein. Damit wird dir schneller und reibungloser geholfen.



  • Boaaaaa...
    Wenn er so programmiert wie er Sätze zuammenbaut dann wird das nie was.



  • Dieser Beitrag wurde gelöscht!


  • Folgender Post handelt dein Problem ungefähr ab. Dort wird zwar Boost.Asio verwendet, ist aber prinzipiell dasselbe. Um das umzusetzen musst du vorallem den Rückgabe-Wert von recv() benutzen, und zwar nicht bloss als Error-Code.
    http://www.c-plusplus.net/forum/285079

    Und hier noch eine Meldung betreffend Framing-Protokoll:
    http://www.c-plusplus.net/forum/p2103626#2103626



  • Hi,

    also alle Kreationisten und Künstler versteht man nicht gleich,
    weil kaum jemand so flexibel ist wie diese.

    Ich kenne aber deinen Ansatz, und das beste ist du schreibst eine Datenstruktur
    "raus" mit send() in dessen header Kopf steht immer die zu erwartende
    folgende Datenmenge. Beide Seiten kennen die Header länge.

    Transmitter:
    send(header)
    send(daten)

    Reciever:
    read(header)
    read(daten)

    Der Empänger ließt dann den Header, entnimmt die folgende Datenmenge als Zahlenwert und ließt diese direkt im Anschluß mit Receive. Wird dann die Länge nicht erreicht oder überschritten ist ein schwerer Fehler aufgetreten. Ich habe noch nie erlebt das die dann folgende Menge nicht aufs Byte passt. Mach es so.

    Ein Header hat noch andere Vorteile zb. Paketzähler Autentifizierung uvm.

    Bedenke auch das deine Pakete zerteilt werden, und nict immer im Stück
    ankommen müssen, das heißt für den Datenreceive in einer schleife lesen
    bis Länge erreicht oder Fehler.

    int CMySock::Receive(char *pMem,int Size)
    {
    	int iLen(0),cnt(0);
    
    	 while(((iLen += (cnt = recv(m_sock, (char *)(pMem+iLen), Size, 0))) < Size) && cnt > 0);
    
    	m_BytesReceive+=iLen;
    
    	return iLen;
    }
    

    Gruß K.


Anmelden zum Antworten