Bitmap über SocketVerbindung senden



  • Hallo,

    ich habe eine Client-/Server-Anwendung geschrieben, welche die Klasse CAsyncSocket verwendet.
    Ich habe ein Bitmap geladen, dessen Bits mit der Methode GetBitmapBits in einen ByteBuffer kopiert und diesen dann an den Client gesendet, wo die Bitmaps wieder mit der Methode SetBitmapBits rekonstruiert werden. Die Methoden Get- und SetBitmapBits funktionieren zu meiner vollen Zufriedenheit. Beim Send und Receive jedoch passiert irgendein Fehler.

    Folgende Sachen habe ich schon versucht:
    if(m_ClientSocket.Send(bmpBuffer, bmpX.bmWidthBytes*bmpX.bmHeight) == SOCKET_ERROR)
    if(m_ClientSocket.Send(buffer, sizeof(bmpBuffer)) == SOCKET_ERROR)

    Ich habe sogar schon den ByteBuffer in einen char Buffer vor dem Senden kopiert.

    Nix funktioniert!!!

    Hilfe...



  • Was für ein Fehler entsteht denn ... ?
    ASSERT-Fehler ?

    Gruß
    :: NoName ::



  • Es tritt keine Fehlermeldung auf. Die Daten werden gesendet, aber entweder nicht komplett, da beim Client nur ein Flimmern im oberen Teil des Displays auftaucht. Außerdem sende ich einen BYTE Buffer über den Async Socket, was vielleicht ein Problem ist. Ich habe ihn in einen char Buffer gewandelt, konnte aber nur zwei Pixelreihen darstellen, und das hat eine Ewigkeit gedauert, diese zwei Reihen zu senden.
    Ich brauch bitte dringend Hilfe.
    Danke



  • Bei Async Sockets werden meines Wissens nicht alle Daten mit einem Send verschickt. Und auf der Gegenseite wird natürlich auch nicht alles mit einem Recv ankommen.



  • Sende zuerst die grösse der Gesamtendaten und dann immer wieder 4096 Byte.
    Am Client rufst du im receive immerwieder maximal 4096 byte ab.
    Bei Async solltest du eine schleife zum abrufen bilden, da nicht immer komplett abgerufen wird, da kannst aber einfach das receiveevent verwenden.



  • Man sollte immer den Rückgabewert von Send und Receive benutzen. Die geben zurück wieviel Bytes wirklich versendet wurden bzw. wieviel Bytes empfangen wurden.



  • OK klingt logisch, dass man nicht alles auf einmal senden kann. Den Eindruck hatte ich auch schon einmal als ich einen Counter eingebaut hatte. Aber kann ich überhaupt einen BYTE Buffer über den CAsyncSocket schicken? Oder werden die Daten da nicht verdreht? Ich habe den Buffer mal verdreht. Hat jemand von euch Vorschläge wie ich das Zusammensetzen des Buffers im Client in der OnReceive der View gestalten kann?

    Vielen Dank soweit schon mal für die Antworten.



  • mca schrieb:

    Man sollte immer den Rückgabewert von Send und Receive benutzen. Die geben zurück wieviel Bytes wirklich versendet wurden bzw. wieviel Bytes empfangen wurden.

    Stimmt ich weiss jetzt nimma genau wie aber ich habe das so gemacht:

    char *pbuffer = new char [4097];
    int nrecv;
    
    while ((nrecv=receive(pbuffer,4096))!=0)
    {
    }
    delete [] pbuffer;
    

    Ist jetzt total ausm Stehgreif, keine Gewähr.



  • Multiplex schrieb:

    OK klingt logisch, dass man nicht alles auf einmal senden kann. Den Eindruck hatte ich auch schon einmal als ich einen Counter eingebaut hatte. Aber kann ich überhaupt einen BYTE Buffer über den CAsyncSocket schicken? Oder werden die Daten da nicht verdreht? Ich habe den Buffer mal verdreht. Hat jemand von euch Vorschläge wie ich das Zusammensetzen des Buffers im Client in der OnReceive der View gestalten kann?

    Vielen Dank soweit schon mal für die Antworten.

    Also ich würde das Bild ja (soweit es als Datei vorhanden ist auch so übertragen.
    Du kannst die Datei doch binary öffnen und dann sendest du mit dem ersten befehl z.b. Send("GROESSE 88434",x)
    Beim Receive speicherst du die Daten wieder in eine Datei und wenn das fertig ist, kannste das Bild anzeigen, oder hast was ganz anderes vor?



  • Also, wenn ich einen char Buffer empfange, muss ich auch einen senden, was viel zu lange dauert. Wenn ich die Daten des Bitmap in ein File schreibe und dann das File in über AsyncSocket sende. Kann mir jemand sagen, wie man das bewerkstelligen soll?

    Bitte bitte


Log in to reply