Warum wird nicht alles gesendet?



  • Hallo C++ler,

    ich möchte eine Funktion schreiben, die einen

    vector<unsigned char>
    

    in 1024 Byte Blöcken schickt. Mein bisheriger Versuch: [code="cli"]int SecureSocket::_Write(std::vector<unsigned char> Data, int DataLenght)
    {
    try{
    if(hSocket == 0){
    return -1;
    }
    const int MAX_DATA_LENGHT = 1024;
    int Position = 0;
    int Result = 0;
    EnterCriticalSection(&CriticalSection);
    while(true){
    if((Position + MAX_DATA_LENGHT) >= DataLenght){
    Result = send(hSocket, (char
    )&Data[Position], (DataLenght - Position), 0);
    if(Result <= 0){
    LeaveCriticalSection(&CriticalSection);
    return -1;
    }
    Position = Position + Result;
    break;
    }else{
    Result = send(hSocket, (char*)&Data[Position], MAX_DATA_LENGHT, 0);
    if(Result <= 0){
    LeaveCriticalSection(&CriticalSection);
    return -1;
    }
    Position = Position + Result;
    }
    }
    LeaveCriticalSection(&CriticalSection);
    return Position;
    }catch(...){
    LeaveCriticalSection(&CriticalSection);
    return -1;
    }
    }[code="cpp"]
    Dieser funktioniert auch, wenn der Vector weniger als 1024 unsigned chars enthält, sobald er allerdings darüber hinaus geht, werden die ersten 1024 Bytes gesendet und der zweite Sende Vorgang gibt -1 zurück :(. Wo liegt der Fehler?

    Vielen Dank im Voraus



  • Wo liegt der Fehler?

    Wenn du das beantwortet haben willst, dann musst du dir mehr Muehe beim Minnimalbeispiel geben, alles unnoetige wie CriticalSection oder try .. catch weglassen (dein C++ ist grauenhaft) und die Codetags richtig setzen. Darueber ist es wichtig, ob TCP oder UDP, wie reagiert die Gegenstelle, wird der Socket vielleicht von der anderen Seite geschlossen, was ist mit GetLastError ...

    Vielleicht http://beej.us/guide/bgnet/output/html/multipage/advanced.html#sendall leicht veraendert:

    #include <sys/types.h>
    #include <sys/socket.h>
    
    int sendall(int s, char *buf, int *len)
    {
        int total = 0;        // how many bytes we've sent
        int bytesleft = *len; // how many we have left to send
        int n = 0;
        int to_send = 0;
    
        while(total < *len) {
            to_send = bytes_left > 1024 ? 1024 : bytes_left;
            n = send(s, buf+total, to_send, 0);
            if (n == -1) { break; }
            total += n;
            bytesleft -= n;
        }
    
        *len = total; // return number actually sent here
    
        return n==-1?-1:0; // return -1 on failure, 0 on success
    }
    


  • Gut, ich hab etwas hilfreiches gefunden: WSAGetLastError() gibt WSAEFAULT zurüvk mit der Description "Bei dem Versuch das Zeigerargument eines Aufrufs zu
    verwenden, wurde eine ungültige Zeigeradresse gefunden". Was wohl heißt, dass der zeiger auf meinen vector<unsigned char> nicht so funktioniert, wie er sollte... Ich habe jedoch bereits nachgefragt und mir wurde gesagt ich könnte den vector genauso wie ein Array von unsigned char Werten nutzen. Wie setze ich das jetzt am besten um?

    Danke im Voraus



  • Ich habe jedoch bereits nachgefragt und mir wurde gesagt ich könnte den vector genauso wie ein Array von unsigned char Werten nutzen

    Du hast aber keinen vector, sondern nur einen Zeiger auf einen vector.

    (char*)&Data[Position]
    

    Das ist so wie geschrieben falsch. Data ist ein Pointer auf den vector, du willst einen Zeiger auf Daten im vector: (char*)&((*Data)[Position]).


  • Mod

    knivil schrieb:

    Ich habe jedoch bereits nachgefragt und mir wurde gesagt ich könnte den vector genauso wie ein Array von unsigned char Werten nutzen

    Du hast aber keinen vector, sondern nur einen Zeiger auf einen vector.

    Mit einer Referenz wäre das nicht passiert.



  • (char*)Data[Position]
    

    funktioniert jedoch nicht, obwohl es müsste.... 😞

    Danke im Voraus



  • -Socket- schrieb:

    funktioniert jedoch nicht, obwohl es müsste.... 😞

    Nein, das ist Käse. Knivil hat doch geschrieben, wie es heißen müsste.



  • ...


Anmelden zum Antworten