2014-06-19 3 views
1

파일을 읽고 쓰는 데 모두 열었으며 파일 설명자 3 (즉 exec 3<>/dev/udp/10.10.10.1/161)과이 파일을 연결했습니다. 만들어진 UDP 패킷을 파일 설명자 3으로 리디렉션하고 회신을받을 때 파일 설명자 3에서 어떻게 읽을 수 있습니까? cat 또는 read과 같은 일반적인 도구는 응답으로받은 UDP 패킷 (본질적으로 비트 스트림)이 줄 바꿈 또는 EOF가 없으므로 잘 작동하지 않습니다. 예를 들어 cat은 예상 할 데이터가 더 이상 없다는 것을 모릅니다. (EOF가없는 "cat"비트 스트림

$ cat <&3 
0Gpublic�:�0,0+C1841.local^C 
$ 

내가 10.10.10.1에서받은 UDP 데이터가 있다면 확인하고 싶은 이것은 파일 기술자 3 일부 데이터가 포함되어있는 경우 의미합니다 : 여기에 예를 들어, 당신은 내가 SIGINT에 고양이를했다 방법을 볼 수 있습니다 심지어 단일 비트), 응답이 수신되었습니다.

+1

'cat' 대신'head -c1'을 사용해 보셨습니까? –

+1

아마도'netcat'을 시도할까요? – Barmar

+0

@Felix Frank'head -c1'은 파일에 데이터가있는 한 제대로 작동합니다. 데이터가없는 경우 (예 : UDP 응답이 수신되지 않은 경우) 'head'는 입력을 기다립니다. 이것은'head'가'read'와 비슷한 타임 아웃 ('-t') 옵션을 가지고 있다면 해결할 수 있습니다 .. – Martin

답변

1

문제는 최종 패킷을 올바르게 인식 할 수 없다는 것입니다. EOF (당신이 알아 차렸 듯이) 특수 문자 또는 파일 - 닫힌 이벤트 또는 이와 유사한 유사 기호가 없습니다. 대신 당신이 할 수있는 모든 중 하나

  • 문자의 고정 된 크기를 읽을 (경우에 대비하여 패킷의 크기가 고정) 또는이 완료 또는
  • 이 패킷의 구문 상태까지 하나의 토큰을 (어쩌면 바이트) 읽기입니다
  • 타임 아웃이 발생할 때까지 읽습니다.

첫 번째 두 가지는 귀하의 책임입니다.

마지막 하나는 일정 시간 후에 죽일 서브 쉘에서 cat 사용하여 달성 할 수 있습니다

cat <&3 & pid=$! 
sleep 0.1 
kill "$pid" 2>/dev/null 

기능이 넣어 및 각 호출 한 0.1 초를 지속하고 출력은 무엇을 할 수 그 시간에 읽어야한다.

+1

설명해 주셔서 감사합니다! 마침내'-n 1 -t 2 <& 3'을 읽었습니다. 파일에 적어도 일부 데이터가있는 경우'read'는 0으로 끝나고 파일이 비어있는 경우'read'는 2 초 후에 타임 아웃하고 0이 아닌 종료 코드를 갖습니다. – Martin