我正在处理一个网络项目,并且我知道 select() 函数(使用 FD_XXX)返回已准备好并包含在 fd_set 结构中的套接字句柄的总数,但我们是否知道这些套接字(作为 SOCKET 或 INT)?只有使用 FOR LOOP-CHECK FD_ISSET 来获取套接字列表,对吗?不然怎么办?
问问题
1228 次
1 回答
2
尽管其他人对 select() 的返回值有什么看法,但我在处理大量套接字时使用这种方式,它并不能保证您不必处理所有列表,以防万一只有一个套接字是最后一个,但如果它是第一个,它会保存一些代码。
int i;
int biggest=0;
fd_set sfds;
struct timeval timeout={0, 0};
FD_ZERO(&sfds);
for (i=0; i < NumberOfsockets; i++)
{
FD_SET(SocktList[i], &sfds);
if (SocktList[i] > biggest) biggest=SocktList[i];
}
timeout.tv_sec=30;
timeout.tv_usec=0;
// biggest is only necessary when dealing with Berkeley sockets,
// Visual Studio C++ (and others) ignore this parameter.
if ((nReady=select((biggest+1), &sfds, NULL, NULL, TimeOut)) > 0)
{
for (i=0; i < NumerbsOfSocket && nReady > 0; i++)
{
if (FD_ISSET(SocketList[i], &sfds)) {
// SocketList[i] got data to be read
... your code to process the socket when it's readable...
nReady--;
}
}
}
于 2013-06-26T18:14:23.040 回答