Значение тайм-аута SO_RCVTIMEO не вступает в силу в API recv_from - PullRequest
0 голосов
/ 25 сентября 2019

Я пытался использовать опцию SO_RCVTIMEO для тайм-аута, когда нет данных в recvfrom API.Но это не вступает в силу, и код застрял, когда нет данных из источника.

Я даже пытался использовать recv вместо recvfrom.Все та же проблема.

Пожалуйста, дайте мне знать, если что-то отсутствует в моем коде.

int sock_r=socket(AF_PACKET,SOCK_RAW,htons(ETH_P_ALL)); 
if(sock_r<0)
{
    printf("open_raw_socket(): error in opening the socket");
    return -1;
}

struct timeval tv;
tv.tv_sec = 1;
tv.tv_usec =  0;
int ret = setsockopt(sock_r, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv));
perror("error: ");

socklen_t ntrcv, ntsnd; 
struct timeval trcv;   
ntrcv = sizeof(struct timeval); 
if (getsockopt(sock_r, SOL_SOCKET, SO_RCVTIMEO, &trcv, &ntrcv) < 0) 
{
    perror("2");
    TF_MSG("error");
}  

while(1)
{
    saddr_len=sizeof saddr;
    recv_len = recvfrom(sock_r,buffer,buflen,0,&saddr,(socklen_t *)&saddr_len);


if(recv_len<=0)
{
    printf("error in reading recvfrom function");
    return 0;
}
.....
...