반응형



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));
}


반응형
Posted by 공간사랑
,