Как подключить клиента к нескольким серверам, которые хранятся в потоках в C - PullRequest
0 голосов
/ 30 мая 2018

Я успешно подключил клиента к одному серверу, который обрабатывает ввод / вывод через функцию выбора, затем я создал больше серверов с потоками. В клиенте я создал новые сокеты, я успешно установил соединение с этими серверами с разными номерами портов и отправил первыйсообщение от сервера к клиенту и клиенту к серверу соответственно. Хотя 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');очистить буфер, который, вероятно, имел новую строку внутри и вызвал такое поведение

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...