【发布时间】: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 吗?