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); }
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(); } } } } }