【问题标题】:Select always returns data [closed]选择总是返回数据[关闭]
【发布时间】:2017-02-27 19:09:51
【问题描述】:

我正在使用 select 从两个套接字读取数据,并且我只从每个套接字发送一条消息。选择似乎永远不会超时,但总是会一遍又一遍地返回 1 或 2 以及相同的消息。每次通过 while 循环时,我都会重置选择参数。

这是我的代码:

while(1)
{
    FD_ZERO(&master); 
    for (i = 0; i < fdmax; i++)
    {
        FD_SET(sock_list[i], &master); 
    }
    tv.tv_sec = 1; 
    tv.tv_usec = 300; 

    int sel = select(fdmax, &master, NULL, NULL, &tv);
    if (sel > 0)
    {
        for (i = 0; i < fdmax; i++)
        {
            if (FD_ISSET(i, &master))
            {
                recv_msg(i, buf); 
                print("msg from %d: %s %d  %d\n", i, buf, sel, tv.tv_sec); 
            }
        }
    }
}

有人发现我的选择有问题吗?

【问题讨论】:

  • 问题更可能出现在recv_msg,因为您似乎从未(完全)读取数据:因此select 告诉您有可用数据
  • 您是否检查过 recv_msg 是否有效?
  • 你没有检查recv_msg的返回值。检查套接字是否关闭或是否存在读取错误。关闭这些套接字,并将它们从您的列表中删除。
  • 就是这样。谢谢大家。
  • 什么是recv_msg()?不应该将 sock_list[i] 作为参数而不是 i 吗?

标签: c sockets select


【解决方案1】:

select() 的第一个参数比最高套接字值高一个,而不是套接字值+1 的计数。

第一个参数可以写成:

select( FD_SETSIZE+1, .... );   

这一行:

if (FD_ISSET(i, &master)) 

不检查正确的事情建议:

if (FD_ISSET( sock_list[i], &master))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-01
    • 2020-09-04
    • 1970-01-01
    • 1970-01-01
    • 2012-11-18
    • 1970-01-01
    相关资源
    最近更新 更多