여기에는 select
이라는 기능이 있습니다. 읽을 소켓에 새로운 입력이 있는지 확인할 수 있습니다. 또한 시간 초과가 있으므로 타이머에도 사용할 수 있습니다.
하나의 양식 또는 모든 주요 운영 체제에 존재합니다. socket select <your operating system> example
에 대한 Google 검색을 수행하면 보트 검색 결과가 표시됩니다.
select
의 마지막 인수가 시간 초과에 사용됩니다. 이것은 struct timeval
에 대한 포인터로 타임 아웃을 설정할 필드가 들어있는 구조체입니다.
이 포인터가 NULL
으로 전달되면 시간 제한이없고 select
이 무기한 차단 될 수 있습니다.
당신은 (이하 백만이어야 함) 초 및 마이크로의 수에
tv_usec
필드로
timeval
구조의
tv_sec
필드를 설정해야합니다, 시간 제한을 설정합니다. 이 입력란을 0으로 설정하여 시간 초과 (예 : 빠른 설문 조사)를 0으로 설정할 수 있습니다.
select
이 0을 반환하면 시간 초과가 발생했습니다.
예 1.5 초 타임 아웃 :
for (;;)
{
fd_set readset;
int maxfd;
/* Initialize and set `readset` and `maxfd` */
struct timeval tv;
tv.tv_sec = 1;
tv.tv_usec = 500000;
int res = select(maxfd + 1, &readset, NULL, NULL, &tv);
if (res == -1)
perror("select"); /* Error */
else if (res == 0)
{
/* Timeout, do something */
}
else
{
/* A socket in `readset` is readable */
}
}
타임 아웃 전에select
복귀하면 timeval
구조는 제한의 남은 시간을 포함하도록 수정된다.
스레드 사용을 고려 했습니까? –
스레드가 문제를 해결할 수 있습니다. –