
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