11월, 2013의 게시물 표시

socket select usage, OOB description.

http://man7.org/linux/man-pages/man2/select_tut.2.html man7.org  > Linux >  man-pages   NAME  |  SYNOPSIS  |  DESCRIPTION  |  RETURN VALUE  |  NOTES  |  EXAMPLE  |  SEE ALSO  |  COLOPHON The Linux Programming Interface SELECT_TUT(2) Linux Programmer's Manual SELECT_TUT(2) NAME          top select, pselect, FD_CLR, FD_ISSET, FD_SET, FD_ZERO - synchronous I/O multiplexing SYNOPSIS          top /* According to POSIX.1-2001 */ #include <sys/select.h> /* According to earlier standards */ #include <sys/time.h> #include <sys/types.h> #include <unistd.h> int select(int nfds , fd_set * readfds , fd_set * writefds , fd_set * exceptfds , struct timeval * utimeout ); void FD_CLR(int fd , fd_set * set ); int FD_ISSET(int fd , fd_set * set ); void FD_SET(int fd , fd_set * set ); void FD_ZERO(fd_set * set );

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 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

tcp socket keepalive setting

SOCKET에 대한 keep alive option 주기. tcp 영역에서 알아서 해주는데, 로직상에서 타임아웃을 걸어 끊고있다면 의미없음. OS마다 지원여부가 다르므로 확인 후 사용 필요.   int s;   int optval;   int optlen = sizeof(optval);   /* Set the option active */   optval = 1;   optlen = sizeof(optval);   if(setsockopt(sock, SOL_SOCKET, SO_KEEPALIVE, (char*)&optval, optlen) < 0) {  perror("setsockopt()");  LOG(TAG, "WEBSOCKET keep alive option fail.");   }   /* Check the status again */   if(getsockopt(sock, SOL_SOCKET, SO_KEEPALIVE, (char*)&optval, &optlen) < 0) {  LOG(TAG, "WEBSOCKET keep alive option fail.");  perror("getsockopt()");   }   LOG(TAG, "WEBSOCKET KEEPALIVE is %s\n", (optval ? "ON" : "OFF"));