Hello everyone,
I’m trying to program a konversation server for my school (42). But i block on a problem from three days… When I /PART from a channel I get an error that causes an infinite loop. This is because recv returns a -1 and the perror say bad file descriptor. Any idea where to look for the solution to my problem? If you need more info like the code of our project I can give it to you if needed.
@Gobelin_Nounours :
Looking at your error description, you seem to be attempting to implement a thread safe container to pass data between threads by using a C++ Channel.
If that’s the case, are you using OpenCV and/or the C++ Boost libraries?
Franken14679:
OpenCV
Hello Franken14679 and thanks for your help. We need to do it in c++98 only. We use poll().
i copy paste the while loop we used to receipt message from konversation
while (isRunning)
{
std::cout << BLUE << ON_BLACK << "Waiting incoming connection ( poll() )..." << RESET << std::endl;
rc = poll(&(server->fdP[0]), fdsId, -1);
server->fdNb = fdsId;
for (int i = 0; i < server->fdNb; i++)
{
if(server->fdP[i].revents == 0)
continue;
newFd = 0;
if (server->fdP[i].fd == server->getServerSocket()) // si serveur socket == fd
{
while (newFd != -1)
{
newFd = accept(server->getServerSocket(), NULL, NULL);
if (newFd != -1) // lorsque le retour de accept est différent de -1 cela signifie qu'un client demande une connexion
{
try
{
std::cout << YELLOW << ON_BLACK << "New user connected with id " << newFd << "." << RESET << std::endl;
server->protocolNewUser(newFd);
fdsId++;
}
catch (const std::exception& e)
{
std::cerr << "[Error] during user creation : " << std::endl;
std::cerr << e.what() << std::endl;
server->deleteUser(newFd);
close(newFd);
}
}
}
}
else if (server->fdP[i].fd == -1)
break;
else
{
std::cout << "~~~~~~ " << server->fdP[i].fd << " ~~~~~~" << std::endl;
std::cout << "~~~~~~ " << buffer << " ~~~~~~" << std::endl;
std::cout << "~~~~~~ " << sizeof(buffer) << " ~~~~~~" << std::endl;
rc = recv(server->fdP[i].fd, buffer, sizeof(buffer), MSG_DONTWAIT);
if (rc == -1)
{
perror("recv() error");
exit(0);
}
if (rc == 0) // Lorsque le retour de recv cela signifie que le client a fermé la connexion
{
close(server->fdP[i].fd);
server->deleteUser(server->fdP[i].fd);
//server->checkChannel(); a faire et comprendre
server->fdP[i].fd = -1;
std::cout << "User succesfully deleted" << std::endl;
std::cout << std::endl;
continue;
// ctrl-c de netcat, utilisateur quit
}
buffer[rc] = '\0';
std::string strmess(buffer);
if (server->haveN(strmess) == false) // pas de \n a la fin du message, ctrl-d
{
continue;
}
else
{
try
{
std::cout << "----- " << i << " -----" << std::endl;
interpretCommand(*server, strmess, server->fdP[i].fd);
//sleep(3);
}
catch(const std::exception& e)
{
std::cerr << e.what() << '\n';
}
}
}
// std::cout << DIVIDER << RESET << std::endl;
}
}
on many words, the program work normaly (PRIVMSG, JOIN, …) it’s only when we part from a channel
We have find the problem… in a function we duplicate the server pointer…