gpt4 book ai didi

c++ - 当数据存在时,使用 select() 检查套接字返回 0

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:55:58 25 4
gpt4 key购买 nike

我的套接字类已经工作了一段时间,但我想使用 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 << "]\n\n";

// Check
if (FD_ISSET(m_sock,&Sockets))
std::cout << "\nFD_ISSET(m_sock,&Sockets) is true\n\n";
else
std::cout << "\nFD_ISSET(m_sock,&Sockets) is false\n\n";

// 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 READ\n";
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::recv\n";
return 0;
}
else if ( status == 0 )
{
return 0;
}
else
{
s = buf;
return status;
}
}
// If data not present
else
{
std::cout << "\nDATA WAS NOT READY, TIMEOUT\n";
return 0;
}

最佳答案

正如您已经发现的那样,您对 select 的调用是不正确的。尽管第一个参数在许多形式的文档中被命名为 nfds,但它实际上比传递给 的任何 fd_set 持有的最大文件描述符号多一个>选择。在这种情况下,由于您只传入一个文件描述符,因此调用应该是:

retval = select(m_sock + 1, &Sockets, NULL, NULL, &tv);

如果您有任意数量的套接字,您在不同的线程中处理每个套接字,您可能会找到我对 this question 的回答。更好的方法。

关于c++ - 当数据存在时,使用 select() 检查套接字返回 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11103270/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com