Nonblocking I/O | UNIX C - Network | 2005/03/15 17:16 |
http://blog.naver.com/cache798/120011094189 | |
Nonblocking I/O 소켓호출의 디폴트 동작은 요구된 행위가 종료될때까지 블록되는 것이다. recv()함수는 적어도 하나의 메시지를 받을때까지는 반환하지 않는다. send()의 경우 전송할데이타를 저장할 공간이 충분하지 못하면 블록된다. TCP연결에 관련된 함수들은 연결이 설정될때까지 블록된다. 예를 들면 accept()는 클라이언트가 connect()호 연결을 설정할때까지 블록된다. 하지만 UDP의 경우 중간의 패킷이 유실되었다고 가정하자 그러면 revcfrom()은 영원히 블록되어 있어야 할 것이다. 이런 경우 어느 정도 시간이 지난후 블록에서 풀려 클라이언트가 데이터그램유실을 처리할 수 있도록 해야할 것이다. 해결책. 원하지 않는 블로킹문제를 해결하기위해서는 소켓의 동작을 변경시켜 Nonblocking이 되도록 설정하는 것이다. 이런 경우 소켓에 대해 만약 요구된 연산이 즉시 완료된다면 성공을 반환하고 그렇지 않으면 실패(보통 -1)을 반환한다. 실패의 경우 블록에 의한 실패인지 아니면 다른 형태의 실패인지 구분할수 있어야 한다. TCP 통신의 경우 connect()가 블록에 의해 실패했다면 errno를 EINPROGRESS반환하고, 다른 경우에는 EWOULBLOCK이 반환된다. 설정방법. 디폴트 블로킹동작은 fcntl() 이나 ioctl() 호출로 제어할 수 있다. #include int fcntl(int fd, int cmd, int arg); fd : open socket descriptor cmd : F_SETFL (소켓 플래그 설정), F_GETFL (소켓 플래그 정보를 수집) arg : 소켓 플래그에 지정한 아규먼트값 O_NONBLOCK : Nonblocking 동작설정 사용예제: flag=fcn시(fd,F_GETFL,0); fcn시(fd,F_SETFL,flag|O_NONBLOCK);
#include int ioctl(int fd, unsigned long req, char *arg); |
'Linux' 카테고리의 다른 글
vmware network setting (internet) (0) | 2013.09.26 |
---|---|
[vi] 화면분할, 이동 (0) | 2013.09.26 |
2.2. Bottom Half (0) | 2013.09.26 |
lxr installing document (0) | 2013.09.26 |
[LXR로 소스 코드 올리는 법] (0) | 2013.09.26 |