URL : http://kldp.org/node/69143
---------------------------
non-blocking 구현 recv
---------------------------
nonblock( fd, 1); // 논블록모드로 세팅
recv(fd, 어쩌구... ); // 반드시 리턴값을 검사해야 함!!!! 매우 중요함!! 논블록시의 리턴값과 블록시의 리턴값이 상이함!
nonblock( fd, o); // 다시 블록모드로 세팅
-----------------------
nonblock 구현 방법 관련 소스
-----------------------
// 최신버전의 유닉스 : 대부분
int nonblock(int fd, int nblockFlag)
{
int flags;
flags = fcntl( fd, F_GETFL, 0);
if ( nblockFlag == 1 )
return fcntl( fd, F_SETFL, flags | O_NONBLOCK);
else
return fcntl( fd, F_SETFL, flags & (~O_NONBLOCK));
}
// 오래된 버전의 유닉스들
int nonblock(int fd, int nblockFlag)
{
int flags;
flags = nblockFlag;
return ioctl( fd, FIONBIO, &flags);
}
// 윈도우
int nonblock(int fd, int nblockFlag)
{
unsigned long flags;
flags = nblockFlag;
return ioctlsocket( fd, FIONBIO, &flags);
}
// Amiga
int nonblock(int fd, int nblockFlag)
{
return IoctlSocket( fd, FIONBIO, (long)nblockFlag);
}
// BeOS
int nonblock(int fd, int nblockFlag)
{
long b = nblockFlag ? 1 : 0;
return setsockopt(sockfd, SOL_SOCKET,SO_NONBLOCK,&b,sizeof(b));
}