2012-11-25 2 views
11

신뢰할 수있는 UDP 프로토콜을 구현하기 위해 소켓을 사용하고 있습니다. 다음 코드를 사용하여 승인을 기다리는 소켓에서 시간 초과를 설정하고 있습니다. 내가 왜 errno 11, 자원을 일시적으로 사용할 수 없게되는지 잘 모르겠습니다.Errno : 11, Resource temporary unavailable

나는 또한 코멘트에서 언급 한 선택 방법을 시도했다. 루프 안에 다음과 같은 코드가 있지만 recvfrom은 시간 초과되지 않습니다.

 fd_set set; 
     FD_ZERO(&set);  /* empties the set */ 
     FD_CLR(rcv_sock,&set); /* removes FD from the set */ 
     FD_SET(rcv_sock,&set); /* adds FD to the set */ 

     if(select(rcv_sock + 1, &set, NULL, NULL, &tv) < 0){ 
      printf("\nError Reporting: %d : %s\n\n", errno, strerror(errno)); 
      return -1; 
     } 


     if(!FD_ISSET(rcv_sock,&set)){ /* true if FD is in the set */ 
      printf("socket is not set properly.\n"); 
     } 
+0

대신 select() 및 비 블로킹 소켓을 사용해보십시오. select() 접근 방식은 훨씬 더 유연하고 안정적이며 이식성이 뛰어납니다. –

+0

두 번째 스 니펫에서'recvfrom()'int를 호출 할 필요가 없습니다. – alk

+0

'recvfrom()'은'int'가 아닌'ssize_t'를 리턴합니다, BTW. – alk

답변

13

블로킹 소켓에 recvfrom() 밖으로는 경우에서 recvfrom() 시간에 전화를 (즉 오류 EAGAIN (11)를 얻을 정상입니다 setsockopt()를 사용하여 설정했던 시간을 호출 : 데이터가 시간에 접수되지 않았다 시간 초과로 지정된 기간). man recvfrom에서

축 어적 :

반환 값

...

에러

... .

EAGAIN 또는 EWOULDBLOCK 소켓은 블로킹 표시되고, 수신 동작은 차단 또는 수신 타임 아웃이 설정되어 있고 데이터을 수신하기 전에 타임 아웃이 만료 . ...

이 해결하기 위해 : 그냥 다시 recvfrom() 전화 ... ;-) 나를 위해

+1

굉장 답변! 고맙습니다! – rharrison33

0

, 문제는 특정 포트에 바인딩 된 UDP 소켓에 도착 IPv6 패킷 때문. 이들은 select()를 트리거하고 있었지만 recvfrom()을 사용하여 읽으려고 할 때 "Resource temporarily unavailable"이라는 응답이 반환되었습니다. 내 응용 프로그램에는 IPV6이 필요하지 않으므로 sysctl.conf를 통해 단순히 비활성화했습니다. 문제는 이제 사라졌습니다!