我正在尝试创建每秒处理请求数的过程,在每个请求上创建新线程。然后每个线程打开套接字连接到地址(http 端口)发送 HEAD 请求,获得响应并关闭套接字。
当我每秒发出超过 3 个请求时,我遇到了问题,一段时间后,我在函数的 send() 部分出现错误,我不断收到连接被拒绝。如果我每秒输入更多请求,我会更早地收到错误。如果我每秒只发出 2 个请求,我根本不会收到错误消息。我怀疑我的一些资源用完了,但我找不到哪个。
这是代码的基本结构
//declarations
socketfd = socket(servinfo->ai_family,servinfo->ai_socktype,servinfo->ai_protocol);
arg = fcntl(socketfd, F_GETFL, NULL)) < 0);
arg |= O_NONBLOCK;
fcntl(socketfd, F_SETFL, arg)
if((conn = connect(socketfd, servinfo->ai_addr, servinfo->ai_addrlen)) < 0)
{
if(errno == EINPROGRESS)
{
do
{
tv.tv_sec = CONNECT_TIMEOUT;
tv.tv_usec = 0;
FD_ZERO(&myset);
FD_SET(socketfd, &myset);
if((res = select(socketfd+1, NULL, &myset, NULL, &tv) > 0))
{
if( (arg = fcntl(socketfd, F_GETFL, NULL)) < 0) {
perror("fcntl get 2");
}
arg &= (~O_NONBLOCK);
if( fcntl(socketfd, F_SETFL, arg) < 0) {
perror("fcntl set 2");
}
char szBuf[4096];
std::string htmlreq = "HEAD / HTTP/1.1\r\nHost:";
htmlreq += info->hostName;
htmlreq += "\r\n\r\n";
if((conn = send(socketfd,htmlreq.c_str(),htmlreq.size(),0)) == -1 && errno != EINTR)
{
perror("send");
close(socketfd);
return;
}
if((conn = recv(socketfd,szBuf,sizeof(szBuf)+1,0)) < 0 && errno != EINTR)
{
perror("recv");
close(socketfd);
return ;
}
close(socketfd);
// do stuff with data
break;
}
else
{
//timeout
break;
}
}while(1);
}
else
{
perror("connect");
close(socketfd);
return;
}
}
我从一开始就删除了一些错误检查,一段时间后我得到的输出是“发送:连接被拒绝”。我很感激一些关于可能导致问题的部分的指针,平台是 ubuntu linux。如果需要,我也很乐意发布代码的其他部分。提前Tnx。