簡體   English   中英

命名管道讀取超時

[英]Named-pipe reading timeout

我正在嘗試為我的命名管道的讀取操作設置超時。
為了從命名管道讀取,我正在使用ReadFile函數。
我讀到可以使用SetCommTimeouts函數為此函數設置超時,但是當我嘗試使用它時,我得到系統錯誤1:“函數不正確”。
這是我的代碼(這是客戶端):

m_pipe = CreateFileA(pipeName,   // pipe name 
                         GENERIC_READ |  // read and write access 
                         GENERIC_WRITE, 
                         0,              // no sharing 
                         NULL,           // default security attributes
                         OPEN_EXISTING,  // opens existing pipe 
                         0,              // default attributes 
                         NULL);          // no template file 

    if (m_pipe != INVALID_HANDLE_VALUE)
    {
            DWORD mode = PIPE_READMODE_MESSAGE | PIPE_WAIT;
            ok = SetNamedPipeHandleState(m_pipe, &mode, NULL, NULL);
            COMMTIMEOUTS cto;
            cto.ReadTotalTimeoutConstant = 1000;
            BOOL time = SetCommTimeouts(m_pipe, &cto);
    }

我做錯了什么或者SetCommTimeouts方法不應該與管道一起使用? 有沒有其他方法可以獲得讀取超時?

如果超時的目的是forever不會卡住,你可以考慮在定時循環中調用PeekNamedPipe(...) 這樣您就可以檢查是否有任何東西需要不時閱讀。 或者,可以使用PeekNamedPipe來確定執行讀取之前管道上的讀取是否實際上將獲得任何內容。 這樣可以避免“等待”讀取。

您不能將SetCommTimeouts與命名管道一起使用。 如果您想要超時,則必須使用異步I / O並使用CancelIoCancelIoEx實現超時

ReadFile阻塞,直到它讀取請求的字節數或錯誤/中止發生。 重疊工作相同,即它在相同條件下完成。 試圖使用CancelIoEx實現超時,並發現它丟失了數據。 到目前為止,看不到實現超時的方法,只讀取部分請求的字節數,或讀取緩存的數據。

暫無
暫無

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

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