您好我尝试为我的应用程序编写自己的send和recv函数。每个负载必须处理144个请求数。在加载模式下,我的应用程序同时面临recive超时问题(1个Lakh请求中的5个请求)。在这里我设置了超时的20秒。请告诉我我的代码有什么问题。
recvAll功能:
int recvAll(int s, char *buf, int len, int timeout)
{
fd_set fds;
int n;
struct timeval tv;
FD_ZERO(&fds);
FD_SET(s, &fds);
tv.tv_sec = timeout;
tv.tv_usec = 0;
n = select(s+1, &fds, NULL, NULL, &tv);
if (n == 0) return -2;
if (n == -1) return -1;
int retVal =recv(s, buf, len, 0);
printf("received byes %d\n",retVal);
buf[retVal+1]='\0';
return retVal;
}
功能调用:
do
{
if(0 >= (bytesRcvd =recvAll(sockfd, recvBuffer,1024,20)))
{
perror("Receive Timeout Happened");
close(sockfd);
return -1;
}
totalBytesRcvd += bytesRcvd;
}while(totalBytesRcvd < 1024);
答案 0 :(得分:1)
您的代码存在的问题是您在猜测。它可能是任何错误。你告诉自己这是一个读取超时,但它可能是EOS(bytesRcvd == 0
)或其他一些错误。
答案 1 :(得分:0)
实际上真正的问题是在加载模式下捕获了中断信号(INTR)。所以
do
{
if(0 >= (bytesRcvd =recvAll(sockfd, recvBuffer,1024,20)))
{
if (errno == EINTR) continue;
perror("Receive Timeout Happened");
close(sockfd);
return -1;
}
totalBytesRcvd += bytesRcvd;
}while(totalBytesRcvd < 1024);
这可能是上述问题的答案。