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
Überprüfen Sie den generierten Asm-Code. –
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
'buf_ptr.reset ((char *) malloc (msg_len));'? Sie können malloc nicht mit unique_ptr verwenden, sondern delete. Warum benutzt du nicht std :: vector? –