我正在使用阻塞式套接字来接受连接。我很少遇到这种错误,这使得调试变得困难。accept函数返回EAGAIN错误。那么对于一个阻塞式套接字来说,这怎么可能呢?
SO_RCVTIMEO
套接字选项),那么当超时时间到达时,accept
将返回EAGAIN
。#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/time.h>
#define TESTEXIT(s, f) if (s < 0) { perror(f); exit(1); }
void handler(int x)
{
return;
}
int main()
{
int s;
int r;
struct sockaddr_in sin;
socklen_t sin_len = sizeof sin;
struct timeval timeo = { .tv_sec = 5, .tv_usec = 0 };
signal(SIGUSR1, handler);
s = socket(PF_INET, SOCK_STREAM, 0);
TESTEXIT(s, "socket");
r = listen(s, 10);
TESTEXIT(r, "listen");
r = setsockopt(s, SOL_SOCKET, SO_RCVTIMEO, &timeo, sizeof timeo);
TESTEXIT(r, "setsockopt");
r = accept(s, (struct sockaddr *)&sin, &sin_len);
TESTEXIT(r, "accept");
return 0;
}
recv
超时的套接字,每个超时周期都会出现EAGAIN
错误,我是否不应该在accept
中使用超时,或者只是捕获错误并忽略它是否安全? - razzEAGAIN
返回时让您的程序响应超时,要么如果没有任何任务需要在超时时完成,就不要设置超时。 - caf