소켓을 사용하다보면 어떠한 신호와 연결된 채로 기다리는것이 아니라 지나가야할 경우가 발생한다
그때는 소켓을 넌블러킹으로 만들어주면 된다.
#include <stdio.h>
#include <fcntl.h>
#include
<stdlib.h>
#include <signal.h>
#include
<sys/socket.h>
#include <sys/file.h>
#include
<netinet/in.h>
#include <string.h>
#include
<netdb.h>
#include <string.h>
#include
<arpa/inet.h>
#include <unistd.h>
#include <errno.h>
넌블럭킹 소켓
socket() 으로 생성되는 소켓은 기본값으로 Blocking 소켓이다. 하지만 이미 생성된 소켓을 fcntl() 함수를 사용하여 nonblocking socket으로 변경 가능하다.
※ Blocking Socket(B)/Nonblocking Socket(N)
(여기서 errno는 errno.h를 인클루드해야 이용할수 있다.)
- read
- B : read 버퍼가 비어있을때 block
- N : read 버퍼가 비어있을때 -1 return, errno==EWOULDBLOCK/EAGAIN
* Blocking socket의 경우에 read 버퍼에 존재하는 데이터의 크기가 read시 요청한 데이터의 크기보다 작은 경우라도 read 버퍼에 존재하는 데이터만큼 리턴되며 block 되지 않음.
- write
- B : write 버퍼가 꽉 차있을때 block
- N : write 버퍼가 꽉 차있을때 -1 return, errno==EWOULDBLOCK/EAGAIN
- accept
- B : backlog( 현재의 connection 요청 큐 )가 비어있을때 block
- N : backlog( 현재의 connection 요청 큐 )가 비어있을때 -1 return, errno==EWOULDBLOCK/EAGAIN
- connect
- B : connection이 완전히 이루어질때까지 block
- N : connection이 완전히 이루어지 않더라도 곧바로 return. 나중에 getsockopt로 connection이 완전히 이루어졌는지 확인가능.
※ Nonblocking 소켓의 장점/단점
- 장점 : 멀티스레드를 사용하지 않고도 다른 작업을 할 수 있다.
- 단점 : 프로그램이 복잡해지며, CPU 사용량이 증가한다.
※ Nonblocking 소켓으로 만드는 방법 : fcntl()함수를 이용한다.
int flag;
flag = fcntl( sock_fd, F_GETFL, 0 );
fcntl( sock_fd, F_SETFL, flag | O_NONBLOCK );
이미 생성된 소켓을 fcntl 로 넌블럭 소켓으로 바꿔준뒤 flag 값으로 리턴한다.
'C,C++ ' 카테고리의 다른 글
음성 파일 보낼때 음성타입 구조체 (The structure WAVE for Matex) (0) | 2012.04.12 |
---|---|
calloc vs malloc 함수의 비교 (2) | 2012.03.21 |
MFC에서 중복실행 방지 코드 (0) | 2012.03.21 |
unix 환경에서 getopt() 사용하기.. 파라미터 값으로 옵션주기. (0) | 2012.03.21 |
opendir 디렉토리를 열어보는 함수. (0) | 2012.03.21 |