接收超时与我的插座发生

时间:2014-01-03 05:39:11

标签: c sockets

您好我尝试为我的应用程序编写自己的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);

2 个答案:

答案 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);

这可能是上述问题的答案。