毎秒数のリクエストを処理するプロセスを作成しようとしています。リクエストごとに新しいスレッドが作成されます。次に、各スレッドはアドレス (http ポート) へのソケット接続を開き、HEAD 要求を送信し、応答を取得してソケットを閉じます。
私が抱えている問題は、1秒あたり3つ以上のリクエストを送信したときに発生し、しばらくすると関数の send() 部分でエラーが発生し、接続が拒否され続けます。1 秒あたりにより多くのリクエストを入力すると、エラーが早く発生します。1 秒あたり 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。