개발자 Q&A

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

2025.05.16 06:33

socket_set_timeout 함수의 사용법을 알려주세요

목록
  • JetpackCompose마… 14일 전 2025.05.16 06:33 인기
  • 161
    1
제가 공부 중인 소켓 프로그래밍에서 socket_set_timeout 함수를 사용하려고 하는데, 이 함수의 사용법을 알려주세요.

리눅스에서 socket_set_timeout 함수를 사용하면 소켓의 타임아웃 설정을 변경할 수 있습니다. 하지만, 이 함수는 윈도우에서 지원되지 않습니다. 윈도우에서 대체 함수는 무엇이고, 사용법은 어떻게 되나요?

그리고, socket_set_timeout 함수를 사용할 때, 타임아웃 설정을 0으로 설정하면 어떤 의미가 되나요?

좀 더 구체적인 예제를 통해 socket_set_timeout 함수의 사용법을 알려주세요.

    댓글목록

    profile_image
    나우호스팅  14일 전



    socket_set_timeout 함수는 소켓의 타임아웃 설정을 변경하는 함수입니다. 이 함수는 리눅스에서만 지원되며, 윈도우에서는 대체 함수인 setsockopt 함수를 사용해야 합니다.

    리눅스에서 socket_set_timeout 함수를 사용하는 방법은 다음과 같습니다.

    #hostingforum.kr
    c
    
    #include 
    
    #include 
    
    
    
    int socket_set_timeout(int sockfd, int sec, int usec) {
    
        struct timeval tv;
    
        tv.tv_sec = sec;
    
        tv.tv_usec = usec;
    
        return setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv, sizeof(tv));
    
    }
    
    


    윈도우에서 setsockopt 함수를 사용하는 방법은 다음과 같습니다.

    #hostingforum.kr
    c
    
    #include 
    
    #include 
    
    
    
    int set_socket_timeout(int sockfd, int sec, int usec) {
    
        struct timeval tv;
    
        tv.tv_sec = sec;
    
        tv.tv_usec = usec;
    
        return setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv, sizeof(tv));
    
    }
    
    


    타임아웃 설정을 0으로 설정하면 소켓의 타임아웃 설정이 해제됩니다. 즉, 소켓은 무제한으로 대기하게 됩니다.

    예제를 통해 socket_set_timeout 함수의 사용법을 설명하겠습니다.

    #hostingforum.kr
    c
    
    #include 
    
    #include 
    
    #include 
    
    #include 
    
    #include 
    
    
    
    int main() {
    
        int sockfd;
    
        struct sockaddr_in serv_addr;
    
        int ret;
    
    
    
        // 소켓 생성
    
        sockfd = socket(AF_INET, SOCK_STREAM, 0);
    
        if (sockfd < 0) {
    
            perror("socket");
    
            return -1;
    
        }
    
    
    
        // 서버 주소 설정
    
        serv_addr.sin_family = AF_INET;
    
        serv_addr.sin_port = htons(8080);
    
        inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr);
    
    
    
        // 서버 연결
    
        ret = connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr));
    
        if (ret < 0) {
    
            perror("connect");
    
            return -1;
    
        }
    
    
    
        // 타임아웃 설정
    
        ret = socket_set_timeout(sockfd, 10, 0); // 10초 타임아웃
    
        if (ret < 0) {
    
            perror("socket_set_timeout");
    
            return -1;
    
        }
    
    
    
        // 데이터 송신
    
        char buffer[] = "Hello, Server!";
    
        ret = send(sockfd, buffer, strlen(buffer), 0);
    
        if (ret < 0) {
    
            perror("send");
    
            return -1;
    
        }
    
    
    
        // 데이터 수신
    
        char recv_buffer[1024];
    
        ret = recv(sockfd, recv_buffer, 1024, 0);
    
        if (ret < 0) {
    
            perror("recv");
    
            return -1;
    
        }
    
    
    
        // 타임아웃 설정 해제
    
        ret = socket_set_timeout(sockfd, 0, 0); // 타임아웃 해제
    
        if (ret < 0) {
    
            perror("socket_set_timeout");
    
            return -1;
    
        }
    
    
    
        // 데이터 수신
    
        ret = recv(sockfd, recv_buffer, 1024, 0);
    
        if (ret < 0) {
    
            perror("recv");
    
            return -1;
    
        }
    
    
    
        printf("%sn", recv_buffer);
    
    
    
        // 소켓 닫기
    
        close(sockfd);
    
        return 0;
    
    }
    
    


    이 예제에서는 소켓의 타임아웃 설정을 10초로 설정하고, 데이터를 송신하고 수신합니다. 이후에 타임아웃 설정을 해제하고 다시 데이터를 수신합니다.

    2025-05-16 06:34

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

검색

게시물 검색