2017-07-17 4 views
0

Ich habe eine Funktion zum Empfangen von Nachrichten variabler Länge über TCP. Die send-Funktion erzeugt einen Puffer, setzt die Länge der Nachricht in die ersten vier Bytes, füllt den Rest mit der Nachricht und sendet nach Teilen. Aber die Empfangsfunktion erhielt 4 Bytes weniger. Und plötzlich, wenn ich einen Printf anlege, funktioniert alles wie es soll.Visual C++ 19.10.25019 - C++ Compiler Fehler?

bool TCP_Server::recvMsg(SOCKET client_sock, std::unique_ptr<char[]>& buf_ptr, int* buf_len) 
{ 
    int msg_len; 
    int rcvd = 0, tmp;//// 
    /* get msg len */ 
    if((tmp = recv(client_sock, (char*)&msg_len, sizeof(msg_len), 0)) == -1) 
    { 
     handle_error("recv"); 
     return false; 
    } 
    *buf_len = msg_len; 
    printf("msg_len = %d\n", msg_len); // 

    printf("tmp getting msg_len = %d\n", tmp);// 
    rcvd += tmp;// 

    buf_ptr.reset((char*)malloc(msg_len)); 
    if(buf_ptr.get() == nullptr) // not enough memory 
    { 
     handle_error("malloc"); 
     return false; 
    } 

    /* get msg of specified len */ 

    /* get by biggest available pieces */ 
    int i = 1; 
    while(int(msg_len - 1440 * i) > 0) 
    { 
     char* cur_ptr = buf_ptr.get() + 1440 * (i - 1); 

     if((tmp=recv(client_sock, cur_ptr, 1440, 0)) == -1) 
     { 
      handle_error("recv"); 
      return false; 
     } 
     printf("1440 = %d\n", tmp); // doesn't work if I comment this line 
     rcvd += tmp; 
     i++; 
    } 
    int rest = msg_len - 1440 * (i - 1); 

    /* get the rest */ 
    if((tmp = recv(client_sock, buf_ptr.get() + msg_len - rest, rest, 0)) == -1) 
    { 
     handle_error("(recv)reading with msg_len"); 
     return false; 
    } 
    rcvd += tmp;// 
    printf("rcvd = %d\n", rcvd);// 
    return true; 
} 

In Summe, wenn ich printf("1440 = %d\n", tmp); kommentieren, die Funktion empfängt 4 Bytes weniger.

Ich kompiliere mit x86 Debug.

Hier ist die ungleichen Linien in asm (/ FA-Flag): http://text-share.com/view/50743a5e Aber ich sehe nichts verdächtig

+0

Überprüfen Sie den generierten Asm-Code. –

+0

Es gibt noch kein Visual Studio (Version) 17. Es gibt Visual Studio 2017, das eine Hauptversion von 15 hat, also könnte man es als VS15 bezeichnen. Bitte lies auch stattdessen die * Full * Compiler-Version und nicht die IDE-Version (die nichts mit der Code-Generierung zu tun hat). – tambre

+4

'buf_ptr.reset ((char *) malloc (msg_len));'? Sie können malloc nicht mit unique_ptr verwenden, sondern delete. Warum benutzt du nicht std :: vector? –

Antwort

1

printf auf die Konsole schreibt, die ein ziemlich langsamer Vorgang ist, relativ gesehen. Die zusätzliche Verzögerung, die es erzeugt, kann leicht ändern, wie viel Daten in dem Puffer angekommen sind, wenn Sie recv aufrufen.

Wie Tulon kommentiert, liest aus TCP-Streams kann jede Länge sein. TCP behält die Nachrichtengrenzen nicht bei, sodass sie nicht unbedingt mit den Sendegrößen am anderen Ende übereinstimmen. Und wenn weniger Daten über das Netzwerk gesendet wurden als Sie zum Lesen aufgefordert haben, erhalten Sie, was verfügbar ist.

Lösung: aufhören zu denken, 1440 Byte Chunks. Befreien Sie sich von i und vergleichen Sie einfach rcvd mit msg_len.

+0

Richtig ... danke. Völlig vergessen, wie ein solches System funktioniert. – Dani