그래서 유닉스 스트림 보조 데이터에 대한 많은 정보를 읽었지만 모든 문서에서 누락 된 부분은 부분 읽기가있을 때 일어나는 일입니다.
24 바이트 버퍼에 다음 메시지를 수신한다고 가정하십시오.
msg1 [20 byes] (no ancillary data)
msg2 [7 bytes] (2 file descriptors)
msg3 [7 bytes] (1 file descriptor)
msg4 [10 bytes] (no ancillary data)
msg5 [7 bytes] (5 file descriptors)
recvmsg에 대한 첫 번째 호출, 나는 모든 msg1 (그리고 msg2의 일부? OS가 그렇게 할 것인가?)을 얻는다. 메시지가 실제로 데이터와 관련하여 무엇을 말하고 있는지 알 때? msg1에서 20 바이트를 비운 다음 recvmsg를 다시 호출하면 msg3과 msg4가 동시에 전달됩니까? msg3 및 msg4의 보조 데이터가 제어 메시지 구조체에 연결됩니까?
실험적 으로이 문제를 찾기 위해 테스트 프로그램을 작성할 수는 있지만 스트리밍 컨텍스트에서 보조 데이터가 어떻게 작동하는지에 대한 설명서 를 찾고 있습니다. 내가 그것에 대해 공식적인 것을 찾을 수 없다는 것이 이상하게 보인다.
이 테스트 프로그램에서 얻은 실험 결과를 여기에 추가하겠습니다.
https://github.com/nrdvana/daemonproxy/blob/master/src/ancillary_test.c
리눅스 3.2.59, 3.17.6
recvmsg를 호출하는 동안 이전의 보조 페이로드를 전달할 필요가없는 한 Linux는 보조 베어링 메시지의 일부를 다른 메시지의 끝에 추가하는 것으로 보입니다. 한 메시지의 보조 데이터가 전달되면 다음 보조 데이터 메시지를 시작하지 않고 짧은 읽기를 반환합니다. 따라서 위의 예에서 내가 읽는 수치는 다음과 같습니다.
recv1: [24 bytes] (msg1 + partial msg2 with msg2's 2 file descriptors)
recv2: [10 bytes] (remainder of msg2 + msg3 with msg3's 1 file descriptor)
recv3: [17 bytes] (msg4 + msg5 with msg5's 5 file descriptors)
recv4: [0 bytes]
BSD 4.4, 10.0
BSD가 리눅스보다 더 많은 정렬을 제공하고, 즉시 짧은 읽기를 제공 하기 전에 보조 데이터와 메시지의 시작입니다. 그러나 비 보조 메시지가 있으면 비 보조 메시지의 끝에 행복하게 추가됩니다. 따라서 BSD의 경우 버퍼가 보조 베어링 메시지보다 큰 경우 거의 패킷과 유사한 동작이 나타납니다. 내가 얻는 읽기는 다음과 같습니다
recv1: [20 bytes] (msg1)
recv2: [7 bytes] (msg2, with msg2's 2 file descriptors)
recv3: [17 bytes] (msg3, and msg4, with msg3's 1 file descriptor)
recv4: [7 bytes] (msg5 with 5 file descriptors)
recv5: [0 bytes]
할 것:
여전히 같은이 어떻게 등 오래된 리눅스, 아이폰 OS, 솔라리스에서 발생하는 방법을 알고하는 것입니다 수있는 미래에 일어날 것으로 예상된다.