簡體   English   中英

閱讀總是比要求的少讀八位字節

[英]read always read less octet than asked

對於家庭作業,我必須創建一個客戶端/服務器程序來存儲數據。 客戶端讀取文件並通過套接字將其發送到服務器,服務器接收它並存儲數據。 最終目標是在多個服務器之間實現分片。 該程序運行良好,但是當客戶端和服務器不在同一台機器上時,讀取函數讀取的數據總是比我要求的要少

這是我的閱讀代碼:

static inline size_t reliableRead(const int sourceSocket, void* data, const size_t nBytes)
{
    size_t dataRead = 0;
    unsigned int lossInARaw = 0;

    do
    {   const size_t readStatus = read(sourceSocket,data+dataRead,nBytes - dataRead);

        if (readStatus == (unsigned)-1)
        {
            LOG_ERRNO_ERROR("error on read");
            break;
        }

        dataRead += readStatus;

        if (readStatus != nBytes)
            LOG_WARNING("data loss(%u): read %zu/%zuo",++lossInARaw,dataRead,nBytes);
    } while (dataRead < nBytes);

    return dataRead;
}

這是我嘗試讀取 1024o 然后 8192o 塊時的結果。 首先客戶端和服務器是兩個不同的主機,然后在同一個

服務器端從另一台機器上的客戶端接收以 1024o 為單位切片的數據時在此處輸入圖片說明

服務器端從另一台機器上的客戶端接收以 8192o 塊分割的數據時在此處輸入圖片說明

服務器端接收數據時客戶端也在本機上在此處輸入圖片說明

從圖像上看,read 顯然能夠讀取 1024o 以上。 我以前從未進行過套接字編程,所以也許我遺漏了一些東西,我怎樣才能讓 read 函數經常讀取我要求它讀取的數據量? 因為即使沒有顯示警告,這顯然會增加發送時間(不要介意時間消息,它顯然是關閉的,我會努力解決的)

對於recv ,而不是read ,POSIX 指定了MSG_WAITALL標志,您應該能夠使用它來防止不必要的上下文切換到您的線程,而它所做的只是重新請求剩余部分read

MSG_WAITALL 在 SOCK_STREAM 套接字上,這請求功能塊直到可以返回全部數據量。 如果套接字是基於消息的套接字,如果捕獲到信號,如果連接終止,如果指定了 MSG_PEEK,或者如果套接字有待處理的錯誤,該函數可能會返回較小的數據量。

暫無
暫無

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

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