WSAAsyncSelect -> FD_READ (Bloß wievel ?)



  • Hallo Leute,
    ich verwende die von WSAAsyncSelect an ein Fenster gesendete Message FD_READ zur Ausführung der Funktion recv um einen buffercontent bekannter Größe zu empfangen.
    Manchmal funktioniert dies auch, aber häufig wird FD_READ kurz hintereinander gerufen, und ich würde gerne wissen, ob nun im ersten oder im zweiten call der „wahre“ buffercontent enthalten ist - vielleicht ist dieser ja auch auf beide calls verteilt. In der Doku steht drinnen, dass FD_READ dann ein zweites mal aufgerufen wird, wenn recv nicht den gesamten buffercontent ausgelesen hat.
    Kann man irgendwie herausbekommen, wieviele Bytes tatsächlich empfangen wurden ?



  • Je soviel wie angezeigt. Echt aufs Byte genau. Tu die Inhalte zusammenfügen.

    Beispiel: Sender sendet 2000Bytes.
    Du kriegst 1500 Bytes. Und dann noch 500. Pappe sie zusammen.

    Beispiel: Sender sendet 1000Bytes und dann noch 1000 Baytes.
    Du kriegst 1500 Bytes. Und dann noch 500. Pappe sie zusammen.

    Das wäre ja leicht. Du schickst ja Objekte, 57Bytes und wenn nur 20 kommen, dann warte einfach auf die anderen 37. Daß noch 1369 oder mehr Bytes im Puffer sind, kümmert Dich nicht in diesem Schleifendurchlauf. TCP-Kommunikation ist genauso einfach wie mit der Konsole. Musst nur in DEINEM Protokoll definieren, wie die Nachrichten kommen. Bei IRC vielleicht mit '\n' als Zeilentrenner. Bei allen Computerspielständen vielleicht mit der Objektgröße als erstem Byte. Das ist Dein Job. Und der Job ist flutschig, eine Sonnenwiese.
    edit: Da kann man OO mit Templates und Makros mal richtig üben wenn man geil drauf ist. Ausnahmsweise mal alle wirklich sinnvoll. Der Code kann Zucker werden, wenn man ihn langfristig beteuen darf, macht man die Mitarbeiter dahingehend doppelt so effizient. Aber nur, wenn man geil drauf ist. Und die Sonnenwiese ist selten, Arcoth soll bitte nicht überall eine sehen. 🤡



  • volkard schrieb:

    Und der Job ist flutschig, eine Sonnenwiese.
    edit: Da kann man OO mit Templates und Makros mal richtig üben wenn man geil drauf ist. Ausnahmsweise mal alle wirklich sinnvoll. Der Code kann Zucker werden, wenn man ihn langfristig beteuen darf, macht man die Mitarbeiter dahingehend doppelt so effizient. Aber nur, wenn man geil drauf ist. Und die Sonnenwiese ist selten, Arcoth soll bitte nicht überall eine sehen. 🤡

    Siehe da: Auch in Volkard steckt ein Poet. 🙂



  • Hallo und Danke für den Beitrag,
    ich glaube meine Frage wurde nicht verstanden (und ich habe auch die Antwort nicht verstanden). Ich wollte nämlich nicht auf der Senderseite irgendwelche Prüfzeichen am Anfang und am Ende der Daten einfügen und nach denen dann auf der Empfängerseite suchen. Vielmehr dachte ich eventuell auf der Empfängerseite neben der Information über das vorliegen empfangener Daten auch zu erfahren, wie viel Bytes empfangen worden sind hat. Gibt es so eine Möglichkeit mit winsock oder muss ich mir irgendetwas selber zusammenbasteln ?



  • Einfach recv(..) bei jedem FD_READ aufrufen, der Rückgabewert von recv(..) gibt dir dann an, wieviele Bytes empfangen wurden. Um die Meldungen zu vervollständigen brauchst du einen weiteren Buffer, in dem du solange Bytes sammelst, bist du weisst, dass die Meldung komplett ist.



  • 7x7-7 schrieb:

    Vielmehr dachte ich eventuell auf der Empfängerseite neben der Information über das vorliegen empfangener Daten auch zu erfahren, wie viel Bytes empfangen worden sind hat.

    Wie schon erwähnt wurde:

    int anzahlEmpfangenerBytes = recv(...
    


  • Hallo und Danke für die Beiträge !
    Für zu empfangenden 8000 Bytes habe ich es folgendermaßen gelöst (es ist jetzt Teil eines .net codes):

    //receiver
    
    int bytes_rec = recv_loc(SOCKET_loc, buffer_received, length, 0);
    if (bytes_rec == -1)Settext(String::Concat("recv_ERROR:",  WSAGetLastError().ToString()));				 
    else if(bytes_rec >1) 	{ //5		
    	memcpy(collector+collector_count,buffer_received, bytes_rec);
    	collector_count = collector_count + bytes_rec;	
    	if(collector_count == 8000) { //6		
    			memcpy(bufferout_1,  collector, 8000);
    			collector_count = 0;
    			delete[] collector;
    			collector = new char[8000];
    						}//-6
    			     } //-5			
    delete [] buffer_received;
    

Anmelden zum Antworten