使用 select() 检查套接字在数据存在时返回 0
check on socket with select() returns 0 when data is present
我的套接字类已经工作了一段时间了,但我想使用 select() 添加一个超时。 看起来很简单,但我总是从 select() 返回 0。 我什至删除了 select() 检查,因此无论 select() 如何它都会读取数据并且数据被读取,但 select() 仍然报告数据不存在。 关于如何让 select() 停止对我撒谎的任何线索? 我还将套接字设置为非阻塞。 谢谢。
法典:
char buf [ MAXRECV + 1 ];
s = "";
memset ( buf, 0, MAXRECV + 1 );
struct timeval tv;
int retval;
fd_set Sockets;
FD_ZERO(&Sockets);
FD_SET(m_sock,&Sockets);
// Print sock int for sainity
std::cout << "nm_sock:" << m_sock << "n";
tv.tv_sec = 1;
tv.tv_usec = 0;
retval = select(1, &Sockets, NULL, NULL, &tv);
std::cout << "nretval is :[" << retval << "]nn";
// Check
if (FD_ISSET(m_sock,&Sockets))
std::cout << "nFD_ISSET(m_sock,&Sockets) is truenn";
else
std::cout << "nFD_ISSET(m_sock,&Sockets) is falsenn";
// If error occurs
if (retval == -1)
{
perror("select()");
std::cout << "nERROR IN SELECT()n";
}
// If data present
else if (retval)
{
std::cout << "nDATA IS READY TO BE READn";
std::cout << "recv ( m_sock, buf, MAXRECV, 0)... m_sock is " << m_sock << "n";
int status = recv ( m_sock, buf, MAXRECV, 0 );
if ( status == -1 )
{
std::cout << "status == -1 errno == " << errno << " in Socket::recvn";
return 0;
}
else if ( status == 0 )
{
return 0;
}
else
{
s = buf;
return status;
}
}
// If data not present
else
{
std::cout << "nDATA WAS NOT READY, TIMEOUTn";
return 0;
}
正如您已经发现的那样,您对select
的调用不正确。尽管第一个参数在许多形式的文档中被命名为nfds
,但它实际上比传递给select
的任何fd_set
所持有的最大文件描述符编号多一个。在这种情况下,由于您只传入一个文件描述符,因此调用应该是:
retval = select(m_sock + 1, &Sockets, NULL, NULL, &tv);
如果您有任意数量的套接字,则在不同的线程中处理每个套接字,您可能会发现我对这个问题的回答是更好的方法。
哎呀。 看起来我忘了设置 select() 的 int nfds:
现在工作得很好。
相关文章:
- C++LinkedList问题.数据类型之间存在冲突?没有匹配的构造函数
- std::weak_ptr 和相应的 std::shared_ptr 之间是否存在数据竞争?
- 将数据定向到不存在的阵列中
- 将数据保存在.cpp上,并在 .h 上运行
- 将数据保存在C++中,从 Python 加载 - 推荐的数据格式
- 仅当数据竞赛存在与锁定时,OpenMP关键部分
- cpp 中是否存在一种数据结构,可以轻松地提供一种基于已存在的实例构建新结构的方法
- 是否存在与将数据流式传输到 c++ 异常类相关的任何危险
- 如何从C 中的HDF5文件中读取属性名称和数据集名称,在这里我不知道HDF5文件中存在什么属性
- 如何检查链表中的数据是否存在C++
- 原子线程围栏:为什么在这个非原子变量上存在数据竞争?这有关系吗
- 即使在返回值之前释放后,数据仍在指针中仍然存在
- 结构数据D = {0}和结构数据D = {}之间是否存在任何区别
- C++简体版链表,当我加载数据以创建链表并输入更多数据时,似乎存在差距
- 在堆栈C++上创建的对象中存在无效数据
- 将数据保存在std :: vector或.txt文件中的速度更快
- 关于返回对不存在数据的引用的设计
- 如何在一个套接字上实现并行请求和响应的非阻塞客户端-服务器通信模型,而不存在数据竞争
- 这段代码中是否存在数据竞争?
- 如何将数据追加到存在数据的文件中