
	                	                 
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