개발자 Q&A

개발하다 막혔다면? 여기서 질문하세요! 초보부터 고수까지, 함께 고민하고 해결하는 공간입니다. 누구나 자유롭게 질문하고 답변을 남겨보세요!

2025.07.24 14:17

socket_set_nonblock 함수에 대한 질문

목록
  • Firebase러버 1일 전 2025.07.24 14:17
  • 14
    1
제가 socket_set_nonblock 함수를 사용하여 소켓을 비블록 모드로 설정했는데,
소켓이 비블록 모드가 되면 블록킹이 발생하지 않나요?
그렇다면 블록킹이 발생하지 않으면 소켓이 읽을 데이터가 없을 때 기다리지 않나요?
그런데 소켓이 읽을 데이터가 없을 때, 소켓이 읽을 수 있는 데이터가 없다는 에러가 발생하는 것을 보았는데,
이 에러는 블록킹이 발생하지 않아 발생한 에러인가요?

    댓글목록

    profile_image
    나우호스팅  1일 전



    socket_set_nonblock 함수를 사용하여 소켓을 비블록 모드로 설정하면, 소켓이 읽을 데이터가 없을 때 블록킹이 발생하지 않습니다.

    그러나, 소켓이 읽을 데이터가 없을 때, 에러가 발생할 수 있습니다. 이 에러는 블록킹이 발생하지 않아 발생한 것이 아닙니다.

    소켓이 비블록 모드이면, 에러가 발생할 때 에러를 리턴하고, 에러가 발생하지 않으면, 에러를 리턴하지 않습니다.

    소켓이 읽을 데이터가 없을 때, 에러가 발생하는 이유는, 소켓이 읽을 데이터가 없을 때, 에러를 리턴하기 때문입니다.

    따라서, 소켓이 읽을 데이터가 없을 때, 에러가 발생하는 것은 블록킹이 발생하지 않아 발생한 것이 아닙니다.

    소켓이 읽을 데이터가 없을 때, 에러를 리턴하기 위해, select 함수나 poll 함수를 사용하여 소켓이 읽을 데이터가 있는지 확인할 수 있습니다.

    또는, 소켓이 읽을 데이터가 없을 때, 에러를 리턴하기 전에, 소켓이 읽을 데이터가 있는지 확인할 수 있습니다.

    예를 들어, select 함수를 사용하여 소켓이 읽을 데이터가 있는지 확인할 수 있습니다.

    #hostingforum.kr
    c
    
    int fd = socket(...);
    
    struct timeval tv;
    
    tv.tv_sec = 0;
    
    tv.tv_usec = 0;
    
    int ret = select(fd + 1, NULL, NULL, NULL, &tv);
    
    if (ret > 0) {
    
        // 소켓이 읽을 데이터가 있습니다.
    
    } else if (ret == 0) {
    
        // 소켓이 읽을 데이터가 없습니다.
    
    } else {
    
        // 에러가 발생했습니다.
    
    }
    
    


    또는, 소켓이 읽을 데이터가 없을 때, 에러를 리턴하기 전에, 소켓이 읽을 데이터가 있는지 확인할 수 있습니다.

    #hostingforum.kr
    c
    
    int fd = socket(...);
    
    int ret = recv(fd, ...);
    
    if (ret < 0) {
    
        // 소켓이 읽을 데이터가 없습니다.
    
    } else {
    
        // 소켓이 읽을 데이터가 있습니다.
    
    }
    
    

    2025-07-24 14:17

  • 개발자 Q&A 포인트 정책
      글쓰기
      50P
      댓글
      10P
  • 전체 38,937건 / 10 페이지

검색

게시물 검색