2014-01-03 2 views
0

Привет Я пытаюсь написать свою собственную функцию отправки и возврата для моего приложения. Который должен обрабатывать 144 числа запросов в секунду в нагрузке. В режиме загрузки мое приложение одновременно сталкивалось с проблемой тайм-аута восстановления (5 запросов в 1 запросе Lakh). Здесь я установил 20 секунд для таймаута. PLS скажите мне, в чем проблема с моим кодом.Время ожидания приема с моим сокетом

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

Добавить проверку ошибки для возвращаемых значений 'select' –

ответ

1

Проблема с кодом, что вы угадали. Это может быть любая ошибка. Вы говорите себе, что это тайм-аут чтения, но это может быть EOS (bytesRcvd == 0) или некоторая другая ошибка.

+0

да, вы правы. сервер отправляет ответ, но мы его не получили. Когда сервер пытается отправить ответ, наше приложение закроет соединение сокета за эти 1 секунду. – Jeyamaran

+0

1 секунда? 20 секунд? Прими решение. 1 секунда - это смехотворно короткий тайм-аут. Попробуйте что-то реалистичное. – EJP

+0

Только 20 секунд. но наше соединение закрывается в течение 1 секунды. Это наша проблема с этим кодом. Я не знаю, почему это соединение запустилось за 1 секунду, даже сервер имеет достоверные данные в качестве ответа. – Jeyamaran

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

Это может быть ответ на указанный вопрос.

Смежные вопросы