C ++ Sockets – сервер не принимает несколько клиентов (linux)

У меня есть рабочий сервер и клиентский код. Сервер и клиент могут правильно подключаться и общаться друг с другом. Но когда я открываю другой клиентский терминал, клиент говорит « Awaiting confirmation from the server и ничего больше. Хотя сервер и клиент # 1 все еще могут общаться.

Я искал multithreading, но примеры или fragmentы кода, которые они показывают, продвинуты. Может быть, небольшое объяснение или пример помогут много!

Код ниже работает. У меня есть рабочий сервер, но он принимает только одно соединение. Как заставить сервер разрешить несколько соединений? Чтобы я мог сделать программу похожей на групповой чат.

client.cpp (когда клиент # 2 подключается, код зависает по строке 40)

 #include  #include  #include  #include  #include  #include  #include  #include  #include  using namespace std; int main() { char a; int client; int portNum = 1500; int bufsize = 1024; char* buffer = new char[bufsize]; bool isExit = false; char* ip = "127.0.0.1"; struct sockaddr_in direc; if ((client = socket(AF_INET, SOCK_STREAM, 0)) < 0) { cout << "\nError creating socket..." << endl; exit(0); } cout << "\nSocket created successfully..." << endl; direc.sin_family = AF_INET; direc.sin_port = htons(portNum); inet_pton(AF_INET, ip, &direc.sin_addr); if (connect(client,(struct sockaddr *)&direc, sizeof(direc)) == 0) cout << "Connection to the server " << inet_ntoa(direc.sin_addr) << endl; cout << "Awaiting confirmation from the server..." << endl; //line 40 recv(client, buffer, bufsize, 0); cout < Enter # to terminate the connection\n" << endl; do { cout <> buffer; send(client, buffer, bufsize, 0); if (*buffer == '#') { send(client, buffer, bufsize, 0); *buffer = '*'; isExit = true; } } while (*buffer != 42); cout << "Server: "; do { recv(client, buffer, bufsize, 0); cout << buffer << " "; if (*buffer == '#') { *buffer = '*'; isExit = true; } } while (*buffer != 42); cout << endl; } while (!isExit); cout < Connection terminated.\nGoodbye"; close(client); return 0; } 

server.cpp

 #include  #include  #include  #include  #include  #include  #include  #include  using namespace std; int main() { int client, server; int bufsize = 1024; int portNum = 1500; bool isExit = false; char* buffer = new char[bufsize]; struct sockaddr_in direc; socklen_t tamano; pid_t pid; if ((client = socket(AF_INET, SOCK_STREAM, 0)) < 0) { cout << "\nError establishing socket..." << endl; exit(1); } cout << "\nSocket server has been created..." << endl; direc.sin_family = AF_INET; direc.sin_addr.s_addr = htons(INADDR_ANY); direc.sin_port = htons(portNum); if ((bind(client, (struct sockaddr*)&direc,sizeof(direc))) < 0) { cout << "\nError binding connection..." << endl; return -1; } tamano = sizeof(direc); cout << "Looking for clients..." < 0) { strcpy(buffer, "Server connected...\n"); send(server, buffer, bufsize, 0); cout << "Connected with the client, you are good to go..." << endl; cout << "Enter # to end the connection\n" << endl; cout << "Client: "; do { recv(server, buffer, bufsize, 0); cout << buffer << " "; if (*buffer == '#') { *buffer = '*'; isExit = true; } } while (*buffer != '*'); do { cout <> buffer; send(server, buffer, bufsize, 0); if (*buffer == '#') { send(server, buffer, bufsize, 0); *buffer = '*'; isExit = true; } } while (*buffer != '*'); cout << "Client: "; do { recv(server, buffer, bufsize, 0); cout << buffer << " "; if (*buffer == '#') { *buffer == '*'; isExit = true; } } while (*buffer != '*'); } while (!isExit); cout < Connection terminated... " << inet_ntoa(direc.sin_addr); close(server); cout << "\nGoodbye..." << endl; isExit = false; } close(client); return 0; } 

Как заставить сервер принимать несколько соединений?

Благодаря!

Чтобы правильно поддерживать несколько подключений, вы должны запустить новый stream для каждого входящего соединения. Каждое новое соединение идентифицируется собственным уникальным дескриптором сокета, возвращаемым accept() . Простой пример:

 while ((accepted = accept(client,(struct sockaddr *)&direc,&tamano)) > 0) { /*Create the thread and pass the socket descriptor*/ if( pthread_create(new_thread, &thread_attributes, &handle_tcp_connection, (void *)accepted) != 0){ perror("create thread"); exit(EXIT_FAILURE); } } 

Вам нужно будет использовать select poll и шаблон автомата, чтобы делать то, что вы хотите сделать. Это означает, что вам нужно будет обрабатывать данные по мере поступления от того, кто его отправляет. Взгляните сюда на рабочий пример.