epoll

sesame·2022년 7월 19일
0

교육

목록 보기
46/46

recv()

result = recv( , , , );

1. result < 0

일반적인 소켓 에러 상황이거나
errno가 EWOULDBLOCK == EAGAIN인 경우에는 recv 시도했으나 읽을 것이 없다는 뜻
select나 epoll_wait에서 해당 fd에 대해서 이벤트가 발생했더라도 바로 recv가 된다는 보장이 없다.
==> EWOULDBLOCK == EAGAIN의 경우 임의의 timeout을 두고 지속적으로 continue를 통한 recv 시도를 하도록 구현해야한다.

2. result == 0

상대방쪽에서 FIN이나 RTS를 보냈다는 의미로 socket close

3. result > 0

받은 메시지

추가하여 SIGPIPE 처리에 대해...

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

0개의 댓글