我正在寫一個服務器端客戶端程序與下面的代碼片段接收數據。套接字recv上select()編輯套接字失敗與etimedout
ret_l = select(readfds+1, &readfds, NULL, NULL ,NULL);
if(ret_l != -1)
{
if(FD_ISSET(myfd, &readfds))
{
ret_l = recv(myfd, buf, size_of_buf_array, 0);
if(ret_l == -1)
return ;
}
}
據我所知,recv在select()ed文件描述符應該接收數據沒有失敗。但是,在我的代碼中收回錯誤ETIMEDOUT失敗。有人請告訴我爲什麼會發生這種情況。還請告訴我一些解決方法,即使在ETIMEDOUT之後也能完全接收數據。
代碼中'readfds'的類型是什麼?從我在文檔中看到的,它應該是一個'fd_set',一個struct {int n,int []},所以在第一個參數中沒有什麼可以安全地使用'+ 1'。你有沒有黑客入侵系統,偶然使用'int readfds'? – quetzalcoatl
這裏沒有代碼在適當的地方檢查errno。您是如何決定獲得ETIMEDOUT的? – nos
當我使用我的公司框架時,我刪除了一些框架細節並複製了需要理解的代碼。 readfds是fd_set類型,select的第一個參數是max(socket函數返回的fds)+1 – syam