Я пытался использовать опцию 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;
}
.....