2012-04-25 1 views
6

저는 단방향 (단방향 전송) 또는 양방향 모드 (양방향)에서 작동 할 수있는 링크를 통해 발신자에서 수신자로 데이터를 전송하는 응용 프로그램을 보유하고 있습니다. 단방향 모드에서 응용 프로그램은 UDP를 사용하여 데이터를 전송하고 양방향에서는 TCP를 사용합니다. TCP 소켓에 쓰기가 차단 될 수 있으므로 Non Blocking IO (FIONBIO-O_NONBLOCK의 ioctl 및 fcntl은이 배포에서 지원되지 않음)와 select() 시스템 호출을 사용하여 데이터를 쓸 수있는시기를 결정합니다. NIO는 네트워크 상태가 악화되면 필요하다면 타임 아웃 후 조기에 전송을 중단 할 수 있도록 사용됩니다. 나는 동일한 기본 코드를 사용하여 전송을하고 싶지만 더 높은 추상화에서 TCP/UDP를 변경하십시오. 이 기능은 TCP에 유용합니다.요청한 것보다 적은 바이트로 Non Blocking UDP 쓰기가 반환 될 수 있습니까?

그러나 UDP 소켓에 대해 Non Blocking IO가 작동하는 방식에 대해 우려하고 있습니다. 매뉴얼 페이지를 잘못 읽었을 수도 있지만, write()가 요청한 것보다 적은 바이트 수를 보낸다고 반환 할 수 있기 때문에 클라이언트가 데이터 그램에서 더 적은 바이트를 수신하게됩니까? 주어진 데이터 버퍼를 보내려면 블로킹되지 않는 IO를 사용하고 있기 때문에 여러 번 쓰기가 필요할 수 있습니다. 나는 이것이 클라이언트에 의해 수신 된 여러 개의 UDP 데이터 그램으로 변환 될 것을 우려하고있다.

나는 소켓 프로그래밍에 대해 상당히 새로운 것이므로 약간의 오해가 있다면 여기에 대해 용서해주십시오. 고맙습니다.

+0

작업하려는 시스템의 세부 정보를 확인하고 싶을 수 있습니다. UDP 스택에는 특정 제한이있을 수 있습니다 (실제로 이미 언급 한 것처럼). – geekosaur

답변

2

정확한 (깨지지 않은) UDP 구현을 가정하면 각 send/sendmsg/sendto는 전송 된 하나의 전체 데이터 그램에 해당하며 각 recv/recvmsg/recvfrom은받은 하나의 전체 데이터 그램에 해당합니다.

UDP 메시지 전체를 전송할 수없는 경우 EMSGSIZE 오류가 발생합니다. 전송 된 메시지는 네트워크의 어느 지점에서 크기 때문에 여전히 실패 할 수 있습니다.이 경우 단순히 도착하지 않습니다. 그러나 IP 스택이 심각하게 버그가없는 한 조각으로 전달되지는 않습니다.

좋은 규칙은 UDP 페이로드 크기를 최대 1400 바이트로 유지하는 것입니다. 이것은 매우 근사하며 분열을 피하기 위해 다양한 형태의 터널링을위한 많은 공간을 남겨 둡니다.

+0

감사합니다. 좀 더 테스트를 한 결과, 내 전체 페이로드가 UDP로 지정된 write() 호출을 위해 전송되지 않았 음을 알았습니다. 실제로 발생하는 유일한 논리적 인 작업입니다. 나는 VxWorks 5.5에서 공급 업체가 제공하는 스택을 사용하여 TOE를 지원합니다 ... 대상 플랫폼에 EMSGSIZE가 표시되지 않는 것은 놀라운 일이 아닙니다. 어쨌든, 권위있는 응답을 주셔서 감사합니다. 확실히 제가베이스를 다뤘다는 확신을 제공하는 데 도움이됩니다. – aig7761

관련 문제