我正在写一个服务器端客户端程序与下面的代码片段接收数据。套接字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