shutdown(2)

#include <sys/socket.h>

int shutdown(int sockfd, int how);

shutdown(2)은 socket을 close하지는 않고 recv기능 또는 send 기능을 못하도록 일부 기능을 제한하는 함수입니다. shutdown(2)을 통하여 socket의 recv 기능 및 send 기능을 사용하지 못하게 하면 다시 그 기능을 살릴 수 없습니다. 또한 recv 기능 및 send 기능을 모두 사용하지 못하게 하여도 socket이 close된 것은 아닙니다.

 

 

파라미터

sockfd
    - socket(2) 또는 accept(2) 등으로 생성한 socket descriptor.
how
    - 어떤 기능을 제한할 것인지를 설정하는 값.
 SHUT_RD : 읽기(수신) 기능을 사용하지 못하도록 설정합니다.
 SHUT_WR : 쓰기(전송) 기능을 사용하지 못하도록 설정합니다.
 SHUT_RDWR : 읽기/쓰기를 모두 사용하지 못하도록 설정합니다. 그러나 socket이 close되지는 않았습니다.

 

RETURN

0
    - 정상적으로 기능 제한이 되었습니다.


-1
    - 오류가 발생하였으며, 오류에 대한 상세 내용은 errno 전역변수에 설정됩니다.
    
 EBADF    : sockf가 유효하지 않은 socket descriptor입니다.
 EINVAL   : how값을 잘못 설정하였습니다.
 ENOTCONN : connect된 socket이 아닙니다.
 ENOTSOCK : socket descriptor가 아닙니다.

 


활용 예제

 

#include <sys/socket.h>

......

if((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
    fprintf(stderr, "Socket 생성 오류: %s\n", strerror(errno));
    return -1;
}

if(connect(sock, (struct sockaddr *)&server_addr, sizeof(struct sockaddr_in)) == -1) {
    fprintf(stderr, "Connection Error: %s\n", strerror(errno));
    close(sock);
    return -1;
}

if(shutdown(sock, SHUT_RD) == -1) {  // 읽기 기능을 차단합니다.
    fprintf(stderr, "Shutdown Error: %s\n", strerror(errno));
    return -1;
}

......

 


see also : Socket 통신과 Socket 응용

 

 

 

 

블로그 이미지

사용자 자연&사람

행복한 개발자 programmer since 1995.

댓글을 달아 주세요