int			new_client(t_server *server, int *actual, char *buff)
{
	int				csock;
	t_sockaddr_in	csin;
	socklen_t		sinsize;

	sinsize = sizeof(csin);
	csock = accept(server->sock, (t_sockaddr *)&csin, &sinsize);
	if (csock == SOCKET_ERROR)
	{
		error("accept");
		return (-1);
	}
	if (read_client(csock, buff) == -1)
		return (-1);
	while (check_pseudo(buff, server) == -1)
	{
		write_client(csock, "Pseudo already used");
		if (read_client(csock, buff) == -1)
			return (-1);
	}
	FD_SET(csock, &(server->rdfs));
	server->max = csock > server->max ? csock : server->max;
	init_client(server, *actual, buff, csock);
	(*actual)++;
	return (csock);
}
Exemple #2
0
int		treat_action(t_socket *sock,
			     struct sockaddr_in addr)
{
  int		i;
  int		addrl;
  char		buff[21];

  addrl = sizeof(addr);
  if ((sock->tmp_sock = accept(sock->main_sock,
			       (struct sockaddr *)&addr,
			       (socklen_t *)&addrl)) < 0)
    write(2, "Accept new connection failed\n", 29);
  i = read(sock->tmp_sock, buff, 20);
  buff[i] = '\0';
  if ((i = -1) && check_pseudo(sock, buff) == -1)
    return (-1);
  if (write(1, buff, my_strlen(buff)) < 0 ||
      write(1, " is now connected\n", 18) < 0)
    return (-1);
  while (++i < MAX_CLIENTS)
    if (sock->cli_sock[i] == 0 && !(sock->status[i] = 0))
      {
	sock->cli_sock[i] = sock->tmp_sock;
	send_list_cli(sock, sock->cli_sock[i], sock->pseudo[i]);
	notify_all(sock, sock->pseudo[i], 1);
	break;
      }
  return (0);
}
void Serveur::demarrage()
{

    while(1)
    {

        if(m_sock_err != SOCKET_ERROR)
        {
            /* Démarrage du listage (mode server) */
            m_sock_err = listen(m_listenning_sock, 2);
            cout << "Listage du port " << m_port << "..." << endl;

            /* Si la socket fonctionne */
            if(m_sock_err != SOCKET_ERROR)
            {
                /* Attente pendant laquelle le client se connecte */
                cout << "Patientez pendant que le client se connecte sur le port " << m_port << "..." << endl;
                m_sockets.push_back(accept(m_listenning_sock, (SOCKADDR*)&m_csin, &m_crecsize)); /*Ajout du socket envoyé par le client dans le tableau dynamique de sockets du serveur */
                m_connexion ++;
                cout << "Un client se connecte avec la socket" << m_sockets[m_connexion-1] << "de " << inet_ntoa(m_csin.sin_addr) << " : " << htons(m_csin.sin_port) <<endl;
                if (check_pseudo(m_listenning_sock) == true)
                {
                    m_threads.push_back(thread(&Serveur::thread_client, this, this, m_sockets[m_connexion-1])); /* Creation (et lancement) d'un thread dans le tableau dynamique de thread qui va s'occuper du client qui vient de se connecter */
                    m_threads[m_connexion-1].detach();
                    clients struct_temoin;
                    m_clients.push_back(struct_temoin);
                    m_clients[m_connexion-1].sock =  m_sockets[m_connexion-1];
                    m_clients[m_connexion-1].IP = inet_ntoa(m_csin.sin_addr);

                }

                else
                {
                    m_connexion --;
                    m_sockets.pop_back();
                }

            }

        }

    }

}