为什么socket在经过数千次迭代之后才可以读取



我正在编写我的http服务器。我使用select函数,看到socket随时可以写入,但只有在数千次迭代后才能读取。如果我使用select(Max+1,&rfd,NULL,NULL,空(,我就不会有这样的问题。为什么它在经过这么多次迭代后才可以读取?

int iteration = -1;
while (true)
{
iteration++;
FD_ZERO(&rfd);
FD_ZERO(&wfd);
FD_SET(listeningSocket, &rfd);
for (std::set<int>::iterator Iter = servingSockets.begin(); Iter != servingSockets.end(); Iter++)
{
FD_SET(*Iter, &rfd);
FD_SET(*Iter, &wfd);
}
int Max = std::max(listeningSocket, *std::max_element(servingSockets.begin(), servingSockets.end()));
res = select(Max + 1, &rfd, &wfd, NULL, NULL);
if (res <= 0)
continue;
if (FD_ISSET(listeningSocket, &rfd))
{
if ((newSocket = accept(listeningSocket, (struct sockaddr *)&listeningSocketAddr, (socklen_t *)&listeningSocketAddr)) < 0)
continue;
fcntl(newSocket, F_SETFL, O_NONBLOCK);
servingSockets.insert(newSocket);
}
for (std::set<int>::iterator Iter = servingSockets.begin(); Iter != servingSockets.end();)
{
if (FD_ISSET(*Iter, &rfd))
{
std::cout<<"iter in loop: "<<iteration<<std::endl;
int bytes_recvd = recv(*Iter, request, request_buffer_size - 1, 0);
if (bytes_recvd < 0)
{
fprintf(stderr, "error recvn");
shutdown(*Iter, SHUT_RDWR);
close(*Iter);
servingSockets.erase(*Iter);
continue;
}
request[bytes_recvd] = '';
parse_http_request(request, &req);
}
if (FD_ISSET(*Iter, &wfd) && req.path[0] != '')
{

send(*Iter, "HTTP/1.1 200 OKnn<h1><a href="">external</a><br><a href="internal">internal</a></h1>", 122, 0);
shutdown(*Iter, SHUT_RDWR);
close(*Iter);
Iter = servingSockets.erase(Iter);
continue;
}
Iter++;
}
}

除非填充了套接字的缓冲区,否则套接字将始终是可写的。

因此,对于每次调用,select都将立即返回,所有套接字都标记为可写。

只有当您实际有东西要写入时,才将套接字添加到写入集。一旦你写了所有你需要的东西,就把它们从集合中删除,不要再加回来(直到下次你需要写到套接字(。


如果不使用写集,则select将不会返回,直到读集中有一个套接字处于活动状态。

最新更新