result = recv( , , , );
일반적인 소켓 에러 상황이거나
errno가 EWOULDBLOCK == EAGAIN인 경우에는 recv 시도했으나 읽을 것이 없다는 뜻
select나 epoll_wait에서 해당 fd에 대해서 이벤트가 발생했더라도 바로 recv가 된다는 보장이 없다.
==> EWOULDBLOCK == EAGAIN의 경우 임의의 timeout을 두고 지속적으로 continue를 통한 recv 시도를 하도록 구현해야한다.
상대방쪽에서 FIN이나 RTS를 보냈다는 의미로 socket close
받은 메시지
send 를 통해서 데이터를 송신시, 받는쪽에서 연결이 끊어지는경우
SIGPIPE signal 를 받고 프로세스가 죽어버리는 경우가 있다.
때문에 SIGPIPE 시그널은 처리해줘야하고
signal(SIGPIPE, SIG_IGN);
로 처리해주거나 send 함수의 flag 에 MSG_NOSIGNAL 를 설정해준다.
while(1){
result = recv(ep_events[i].data.fd, check_buffer, sizeof(char), MSG_DONTWAIT|MSG_PEEK);
// if(result == MY_FALSE){
// //perror("msg peek error");
// //goto FALSE_CLOSE;
// }
if(result > 0)
{
break;
}
if(errno == EAGAIN)
{
break;
}
if(errno == EINTR)
{
goto FALSE_CLOSE;
}
}
enum EPOLL_EVENTS
{
EPOLLIN = 0x001,
#define EPOLLIN EPOLLIN
EPOLLPRI = 0x002,
#define EPOLLPRI EPOLLPRI
EPOLLOUT = 0x004,
#define EPOLLOUT EPOLLOUT
EPOLLRDNORM = 0x040,
#define EPOLLRDNORM EPOLLRDNORM
EPOLLRDBAND = 0x080,
#define EPOLLRDBAND EPOLLRDBAND
EPOLLWRNORM = 0x100,
#define EPOLLWRNORM EPOLLWRNORM
EPOLLWRBAND = 0x200,
#define EPOLLWRBAND EPOLLWRBAND
EPOLLMSG = 0x400,
#define EPOLLMSG EPOLLMSG
EPOLLERR = 0x008,
#define EPOLLERR EPOLLERR
EPOLLHUP = 0x010,
#define EPOLLHUP EPOLLHUP
EPOLLRDHUP = 0x2000,
#define EPOLLRDHUP EPOLLRDHUP
EPOLLONESHOT = (1 << 30),
#define EPOLLONESHOT EPOLLONESHOT
EPOLLET = (1 << 31)
#define EPOLLET EPOLLET
};