使用 select() 检测连接关闭
using select() to detect connection close
如其他帖子所述,我试图在套接字编程中使用 select() 来检测关闭的连接。请参阅以下代码,该代码尝试通过 select() 检测关闭的连接,并检查 recv() returns 是否为 0。在 while 循环开始之前,已经建立了两个 TCP 连接。在我们的对照实验中,第一个连接总是在大约 15 秒后关闭,第二个连接大约在 30 秒后关闭。
理论上(正如其他人所描述的),当它们关闭时,select() 应该 return(在我们的例子中是两次),这使我们能够检测到两个关闭事件。我们面临的问题是 select() 现在只有 returns 一次而且永远不会再发生,这使我们只能检测到第一个连接关闭事件。如果一个 IP 的代码可以正常工作,但不能用于两个或多个连接。
大家有什么想法或建议吗?谢谢
while (1)
{
printf("Waiting on select()...\n");
if ((result = select(max + 1, & readset, NULL, NULL, NULL)) < 0)
{
printf("select() failed");
break;
}
if (result > 0)
{
i=0;
while(i<max+1)
{
if (FD_ISSET(i, &readset))
{
result = recv(i, buffer, sizeof(buffer), 0);
if (result == 0)
{
close(i);
FD_CLR(i, &readset);
if (i == max)
{
max -= 1;
}
}
}
i++;
}
}
}
select()
修改 readset
以删除不可读的套接字。每次调用 select()
时,您都必须重置并用您要测试的最新活动套接字列表填充 readset
,例如:
fd_set readset;
int max;
while (1)
{
FD_ZERO(&readset);
max = -1;
// populate readset from list of active sockets...
// set max according...
printf("Waiting on select()...\n");
result = select(max + 1, &readset, NULL, NULL, NULL);
if (result < 0)
{
printf("select() failed");
break;
}
if (result == 0)
continue;
for (int i = 0; i <= max; ++i)
{
if (FD_ISSET(i, &readset))
{
result = recv(i, buffer, sizeof(buffer), 0);
if (result <= 0)
{
close(i);
// remove i from list of active sockets...
}
}
}
}
如其他帖子所述,我试图在套接字编程中使用 select() 来检测关闭的连接。请参阅以下代码,该代码尝试通过 select() 检测关闭的连接,并检查 recv() returns 是否为 0。在 while 循环开始之前,已经建立了两个 TCP 连接。在我们的对照实验中,第一个连接总是在大约 15 秒后关闭,第二个连接大约在 30 秒后关闭。
理论上(正如其他人所描述的),当它们关闭时,select() 应该 return(在我们的例子中是两次),这使我们能够检测到两个关闭事件。我们面临的问题是 select() 现在只有 returns 一次而且永远不会再发生,这使我们只能检测到第一个连接关闭事件。如果一个 IP 的代码可以正常工作,但不能用于两个或多个连接。
大家有什么想法或建议吗?谢谢
while (1)
{
printf("Waiting on select()...\n");
if ((result = select(max + 1, & readset, NULL, NULL, NULL)) < 0)
{
printf("select() failed");
break;
}
if (result > 0)
{
i=0;
while(i<max+1)
{
if (FD_ISSET(i, &readset))
{
result = recv(i, buffer, sizeof(buffer), 0);
if (result == 0)
{
close(i);
FD_CLR(i, &readset);
if (i == max)
{
max -= 1;
}
}
}
i++;
}
}
}
select()
修改 readset
以删除不可读的套接字。每次调用 select()
时,您都必须重置并用您要测试的最新活动套接字列表填充 readset
,例如:
fd_set readset;
int max;
while (1)
{
FD_ZERO(&readset);
max = -1;
// populate readset from list of active sockets...
// set max according...
printf("Waiting on select()...\n");
result = select(max + 1, &readset, NULL, NULL, NULL);
if (result < 0)
{
printf("select() failed");
break;
}
if (result == 0)
continue;
for (int i = 0; i <= max; ++i)
{
if (FD_ISSET(i, &readset))
{
result = recv(i, buffer, sizeof(buffer), 0);
if (result <= 0)
{
close(i);
// remove i from list of active sockets...
}
}
}
}