我正在尝试用 C 语言编写一个 I/O 非阻塞的服务器,因为有时它会因洪水请求而停机。环顾四周,我注意到 I/O 非阻塞可以解决我的问题。阅读 Beej 指南,我已经实现了 recvtimeout 函数,它设置了一个超时来处理来自客户端的数据。人们告诉我我必须使用select来避免这个问题,但我已经在函数 recvtimeout 中使用了它:
int Server::recvtimeout(int s, char *buf, int len, int timeout)
{
//Check if non-blocking
fcntl(s, F_SETFL, O_NONBLOCK);
int flags = fcntl(s, F_GETFD);
if ((flags & O_NONBLOCK) == O_NONBLOCK) {
fprintf(stderr, "nonblocking active");
}
else {
fprintf(stderr, "nonblocking not active");
}
//End check
fd_set fds;
int n;
struct timeval tv;
// set up the file descriptor set
FD_ZERO(&fds);
FD_SET(s, &fds);
// set up the struct timeval for the timeout
tv.tv_sec = timeout;
tv.tv_usec = 0;
// wait until timeout or data received
n = select(s+1, &fds, NULL, NULL, &tv);
if (n == 0){
return -2; // timeout!
}
if (n == -1){
return -1; // error
}
// data must be here, so do a normal recv()
return recv(s, buf, len, 0);
}
所以,我添加了一段代码,显示是否设置了 NONBLOCK ,但我从来没有读过nonblocking active,所以在我的代码中 nonblocking 是不活动的。如何修改我的代码以启用此功能?
问题是当我从客户端读取字符串并有这样的代码时:
char headerstring[512];
memset(headerstring,0,512);
if(this->recvtimeout(client_fd,headerstring,sizeof(headerstring),10) < 0){
close(client_fd);
}
一切正常,但是使用在事务期间关闭连接的泛洪器,服务器出现故障。我试过 try-catch 和其他任何东西......但没有。