Out-Of-Band socket exception, OOB, MSG_OOB
네트워크 끊김 등의 상황 발생 시 select를 통해 값이 detect 됨.
이 때, OOB 신호가 발생한 것인데, 이를 인지하는 방법에 대한 내용임.
본 내용은 linux, unix 내용.
발췌 http://www.joinc.co.kr/modules/moniwiki/wiki.php/Site/Network_Programing/Documents/Out_Of_Band
이 때, OOB 신호가 발생한 것인데, 이를 인지하는 방법에 대한 내용임.
본 내용은 linux, unix 내용.
발췌 http://www.joinc.co.kr/modules/moniwiki/wiki.php/Site/Network_Programing/Documents/Out_Of_Band
Out-Of-Band
Out Of Band는 TCP(:12)통신에서 쓰인다. Out Of Band는 갓길을 의미하는데, TCP에서는 긴급한 데이터의 통신을 위해서 사용한다. OOB라고 줄여서 부른다.
TCP에서는 URG필드 를 1로 설정하는 것으로 OOB데이터임을 명시한다. URG는 URGENT를 의미한다. TCP 헤더 정보는 TCP 헤더 자세히 보기 문서를 참고하기 바란다.
OOB 데이터라고 해서, 다른 패킷에 우선해서 도착하거나 높은 우선순위로 재조정된다거나 하지 않는다. 왜냐하면 별도의 패킷으로 전달되지 않고, 일반 데이터에 포함되어서 전달이 되기 때문이다. TCP 헤더의 Urgent Pointer로 긴급 데이터가 시작되는 위치를 알 수 있다.
OOB 데이터를 전달 받은 운영체제(:12)는 SIGURG 시그널(:12)을 발생한다. 응용 애플리케이션은 SIGURG에 대한 시그널 핸들러를 설치해서, OOB 데이터를 처리할 수 있다.
OOB 데이터를 사용하기 위해서는 read(:2)함수와 write(:2)함수가 아닌 recv(:2)와 send(:2)같은 소켓 함수를 이용해야 한다.
int send(int s, const void *msg, size_t len, int flags);flags를 MSG_OOB로 설정하면 된다.
SIGNAL 처리
OOB 데이터가 도착하면 SIGURG 시그널이 발생한다. 이 시그널에 대한 시그널 핸들러를 설치함으로써, OOB 데이터를 처리하는 방식이다.
int main() { signal(SIGURG, urg_handler); fcntl(sockfd, F_SETOWN, getpid()); } void urg_handler(int signo) { int readn; char buf[MAX_LINE]; printf("SIGURG Receive\n"); memset(buf, 0x00, MAX_LINE); readn = recv(sockfd, buf, MAX_LINE-1, MSG_OOB); printf("URG DATA %s\n", buf); }
댓글