
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