R
Hi,
mein Server funktioniert soweit ganz gut. Allerdings bekomme ich ab und zu nach einer gewissen Zeit beim hinzufügen des Sockets einen "EBADF" error. Das heißt, der File Descriptor ist kaputt oder es stimmt irgendwas anderes nicht. Allerdings weiß ich nicht woran das liegen kann!
Hier mein Code:
void Server::addFd(int fd)
{
setnonblocking(fd);
struct epoll_event e;
e.events = EPOLLIN | EPOLLHUP;
e.data.fd = fd;
int ret = epoll_ctl(epfd, EPOLL_CTL_ADD, fd, &e);
if(ret < 0)
{
perror("Add FD: epoll_ctl\n");
exit(1);
}
}
void Server::removeFd(int fd)
{
int ret = ::close(fd);
if(ret < 0)
{
perror("Failed closing socket");
}
}
void Server::serverThread()
{
long long n;
//data client[MAX_CLIENTS];
map<string, data> cl;
map<int, string> fd;
Socket serverSocket1, Sock;
serverSocket1.create();
Sock.create();
int listenfd, clientfd;
int i;
int res, state;
bool rebuildPollFd = false;
char buf[MAXRECV + 1];
memset(buf, 0, MAXRECV + 1);
string s;
listenfd = serverSocket1.get_m_sock();
setnonblocking(listenfd);
serverSocket1.bind(serverport);
serverSocket1.listen();
// create epoll's descriptors
epfd = epoll_create(MAX_CLIENTS);
if(epfd < 0)
{
perror("epoll_create\n");
exit(1);
}
// add the listen socket to epoll
struct epoll_event events[MAX_CLIENTS];
addFd(listenfd);
// wait for the events to occur
while(logger->continueRun())
{
res = epoll_wait(epfd, events, MAX_CLIENTS, 100);
if(res < 0)
{
if((errno != EINTR) && (errno != EAGAIN))
{
perror("epoll_wait");
}
}
else
{
for(i = 0; i < res; ++i)
{
if(events[i].data.fd == listenfd)
{
state = serverSocket1.accept(Sock);
if(state < 0)
{
perror("Server accept");
continue;
}
string ip = serverSocket1.get_networkip();
clientfd = Sock.get_m_sock();
cout << clientfd << endl;
if(clientfd >= 0)
{
addFd(clientfd);
}
else
{
cout << "Fault!" << endl;
}
cl[ip].time = stopwatch();
cl[ip].data = 0;
fd[clientfd] = ip;
cl[ip].ip = ip;
}
else
{
n = ::recv(events[i].data.fd, buf, MAXRECV, 0);
string iip = fd[events[i].data.fd];
if(n == 0)
{
cl[iip].time = (stopwatch() - cl[iip].time);
int tmp = cl[iip].data*1000000/cl[iip].time; // average rate
logger->debug(2, "IP: " + cl[iip].ip + " \tData received: " + dTos(cl[iip].data)+ " " + conv.unit + " \tTransferrate: " + dTos(tmp) + " " + conv.unit + "/s");
removeFd(events[i].data.fd);
cl[iip].data = 0;
}
else if(n < 0 && errno != EAGAIN)
{
cl[iip].time = (stopwatch() - cl[iip].time);
cout << events[i].data.fd << " . Error occured, errno: ";
perror("");
cout << endl;
removeFd(events[i].data.fd);
}
else
{
cl[iip].data += n;
}
}
}
Habt ihr ne Idee? Wie kommt der Fehler überhaupt zustande? Kann es am Client liegen?
Gruß und danke vielmals,
Raven