OOB(Out-of-Band) 데이터는 연결된 스트림 소켓 쌍과 연결된 논리적으로 독립적인 전송 채널입니다. OOB 데이터는 일반 데이터와 독립적으로 사용자에게 배달될 수 있습니다. 추상화는 OOB 데이터 기능이 한 번에 하나 이상의 OOB 데이터 블록의 안정적인 배달을 지원해야 한다고 정의합니다. 이 데이터 블록은 하나 이상의 데이터를 포함할 수 있으며 한 번에 하나 이상의 OOB 데이터 블록이 사용자에게 배달 보류 중일 수 있습니다. 대역 내 신호(즉, 긴급 데이터가 일반 데이터와 함께 순차적으로 전달되는 TCP)를 지원하는 통신 프로토콜의 경우 시스템은 일반적으로 일반 데이터 스트림에서 OOB 데이터를 추출하고 별도로 저장합니다(일반 데이터 스트림의 간격을 유지). 이를 통해 사용자는 OOB 데이터를 순서대로 수신하고 중간 데이터를 모두 버퍼링하지 않고도 순서대로 수신할지 선택할 수 있습니다. OOB 데이터를 피킹할 수 있습니다.
사용자는 WSPIoctl(SIOCATMARK) 함수를 사용하여 읽기를 기다리는 OOB 데이터가 있는지 확인할 수 있습니다. 표준 데이터 스트림 내에서 OOB 데이터 블록의 위치 개념이 의미 있는 프로토콜의 경우(즉, TCP) Windows 소켓 서비스 공급자는 표준 데이터 스트림 내에서 OOB 데이터의 마지막 바이트의 위치를 나타내는 개념적 마커를 유지합니다. 이는 SIOCATMARK(WSPIoctl) 기능을 구현하는 데 필요하지 않습니다. OOB 데이터의 존재 또는 부재가 모두 필요합니다.
표준 데이터 스트림 내에서 OOB 데이터 블록의 위치 개념이 의미 있는 프로토콜의 경우 애플리케이션은 일반 데이터 스트림의 일부로 대역 외 데이터를 인라인으로 처리하는 것을 선호할 수 있습니다. 이는 소켓 옵션 SO_OOBINLINE 설정하여 수행됩니다(WSPIoctl섹션참조). OOB 데이터 블록이 일반 데이터 스트림과 완전히 독립적인 다른 프로토콜의 경우 SO_OOBINLINE 설정하려고 하면 오류가 발생합니다. 애플리케이션은 SIOCATMARK WSPIoctl 명령을 사용하여 표시 앞에 읽지 않은 OOB 데이터가 있는지 여부를 확인할 수 있습니다. 예를 들어 데이터 스트림의 표시까지의 모든 데이터가 적절한 경우 삭제되도록 하여 피어와 다시 동기화하는 데 사용할 수 있습니다.
SO_OOBINLINE 사용하지 않도록 설정됨(기본적으로):
- Winsock 서비스 공급자는 WSPAsyncSelect사용하여 알림을 위해 등록된 클라이언트가 정상 데이터의 존재를 알리는 데 FD_READ 사용하는 것과 똑같은 방식으로 FD_OOB 이벤트를 클라이언트에 알립니다. 즉, FD_OOB OOB 데이터가 도착하고 이전에 큐에 대기된 OOB 데이터가 없는 경우와 MSG_OOB 플래그를 사용하여 데이터를 읽을 때 게시되며 읽기 작업이 반환된 후에도 일부 OOB 데이터를 읽어야 합니다. FD_READ 메시지는 OOB 데이터에 대해 게시되지 않습니다.
- Winsock 서비스 공급자는 OOB 데이터가 소켓에 큐에 대기 중인 경우 소켓 집합을 제외한 적절한WSPSelect 반환합니다.
- 클라이언트는 MSG_OOB WSPRecv 호출하여 언제든지 긴급 데이터 블록을 읽을 수 있습니다. OOB 데이터 블록이 큐를 이동합니다.
- 클라이언트는 MSG_OOB 없이 WSPRecv 호출하여 일반 데이터 스트림을 읽을 수 있습니다. OOB 데이터 블록은 일반 데이터가 있는 데이터 스트림에 표시되지 않습니다. WSPRecv호출한 후에도 OOB 데이터가 유지되는 경우 서비스 공급자는 WSPSelect사용할 때 제외 FD_OOB 클라이언트에 알릴 수 있습니다.
- OOB 데이터가 일반 데이터 스트림 내에 위치하는 프로토콜의 경우 단일 WSPRecv 작업이 해당 위치에 걸쳐 있지 않습니다. 한 WSPRecv 표시 앞에 일반 데이터를 반환하고, 표시 후 데이터를 읽기 시작하려면 두 번째 WSPRecv 필요합니다.
SO_OOBINLINE 사용하도록 설정된 경우:
- WSPSelect 및 WSPAsyncSelect 함수를 위해 OOB 데이터에 대한 메시지가 게시되지 않는 FD_OOB OOB 데이터는 일반 데이터로 처리되며 readfds 소켓을 설정하거나 각각 FD_READ 메시지를 전송하여 표시됩니다.
- 클라이언트는 MSG_OOB 플래그가 설정된 WSPRecv 호출하여 OOB 데이터 블록을 읽을 수 없습니다. 오류 코드 WSAEINVAL이 반환됩니다.
- 클라이언트는 MSG_OOB 플래그를 설정하지 않고 WSPRecv 호출할 수 있습니다. 모든 OOB 데이터는 일반 데이터 스트림 내에서 올바른 순서로 전달됩니다. OOB 데이터는 일반 데이터와 혼합되지 않습니다. OOB 데이터를 지나가려면 세 가지 읽기 요청이 있어야 합니다. 첫 번째는 OOB 데이터 블록 이전의 일반 데이터를 반환하고, 두 번째는 OOB 데이터를 반환하고, 세 번째는 OOB 데이터 다음에 일반 데이터를 반환합니다. 즉, OOB 데이터 블록 경계가 유지됩니다.
WSPAsyncSelect 루틴은 SO_OOBINLINE 꺼져 있을 때 OOB 데이터의 존재 알림을 처리하는 데 특히 적합합니다.