network nonblocking socket 넌블러킹 소켓
소켓을 사용하다보면 어떠한 신호와 연결된 채로 기다리는것이 아니라 지나가야할 경우가 발생한다
그때는 소켓을 넌블러킹으로 만들어주면 된다.
#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 값으로 리턴한다.