簡體   English   中英

Visual C ++ 19.10.25019 – C ++編譯器錯誤?

[英]Visual C++ 19.10.25019 – C++ compiler bug?

我有一個通過TCP接收長度可變的消息的功能。 send函數創建一個緩沖區,將消息的長度放在前四個字節中,用消息填充其余部分,然后按部分發送。 但是接收功能少接收4個字節。 突然之間,當我放置一個printf時,一切都按預期運行。

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;
}

總之,如果我評論printf("1440 = %d\\n", tmp); ,該函數少接收4個字節。

我正在使用x86調試進行編譯。

這是asm(/ FA標志)中不同的行: http : //text-share.com/view/50743a5e但我看不到任何可疑的地方

printf寫入控制台,相對來說,這是一個相當慢的操作。 當您調用recv時,它產生的額外延遲可能很容易更改已到達緩沖區的數據量。

正如Tulon所說,從TCP流中讀取的數據可以是任意長度。 TCP不會保留消息邊界,因此它們不一定與另一端的發送大小匹配。 而且,如果通過網絡發送的數據少於您要求讀取的數據,那么您將獲得可用的數據。

解決方案:停止考慮1440字節的塊。 擺脫i並簡單地將rcvdmsg_len進行比較。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM