Я успешно подключил клиента к одному серверу, который обрабатывает ввод / вывод через функцию выбора, затем я создал больше серверов с потоками. В клиенте я создал новые сокеты, я успешно установил соединение с этими серверами с разными номерами портов и отправил первыйсообщение от сервера к клиенту и клиенту к серверу соответственно. Хотя select на этих серверах может обрабатывать новые подключения, он не распознает ввод-вывод из существующих подключенных сокетов.
client:
bzero(buffer,1024);
valread = read( sock , buffer, 1024);//receive first message
printf("%s\n",buffer );
while (1) {
bzero(buffer,1024);
printf("write:\n");
fgets(buffer,1024,stdin);//write something
buffer[strcspn(buffer, "\n")] = 0;
if (strcmp(buffer,"exit***")==0) {
valread = write(sock, buffer, strlen(buffer));
exit(1);
}
send(sock , buffer , strlen(buffer) , 0 );//here program stuck and waiting for select in server, but in server nothing happens
bzero(buffer,1024);
valread = read( sock , buffer, 1024);
printf("%s\n",buffer );
}
в ситуации с одним сервером и многими клиентами, он работает, но в многосерверной ситуации (в потоках), как это, он застрял в функции выбора. Есть ли ошибка с потоками и выберите?
обновление
я обнаружил, что ошибка в fgets (buffer, 1024, stdin);На первой итерации fgets не ждет, пока пользователь что-то наберет, и передает 0 байт для отправки функции ... Сервер не может обработать это.
решение до того кода, который я добавил, пока((getchar ())! = '\ n');очистить буфер, который, вероятно, имел новую строку внутри и вызвал такое поведение