Need help for programming a server in c++

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.

  • Is that guess correct?

If that’s the case, are you using OpenCV and/or the C++ Boost libraries?

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…