Принять, не ожидая новых подключений - PullRequest
0 голосов
/ 05 апреля 2020

Я работаю над этим календарем / напоминаниями сервер-клиент. Я наткнулся на ошибку, из-за которой, возможно, неправильно понял поведение функции accept() при попытке обработать новые соединения.

Клиент в основном указывает день для просмотра и отправляет его на сервер, а затем получает некоторый текст назад и закрывает соединение. (Я использовал te lnet и netcat, чтобы проверить это до сих пор.) После того, как я нажал ctrl + d на netcat, после того как я отправил команду и получил сообщение, сервер получает и бесконечный вывод l oop из «Новое соединение \ n».

Я понял, что accept() состоял в том, что когда он вызывается, он устанавливает в левой части дескриптор сокета для соединения на listen() Отставание или ожидание, пока не будет соединение, прежде чем вернуться. Поэтому я либо ошибаюсь, либо делаю что-то не так:

bind(client_socket, (struct sockaddr*)&server_address, sizeof(server_address));

listen(client_socket, 5);



//start main loop. first level checks for commands
while (1)
{
  client_socket = accept(client_socket, NULL, NULL);
  printf("New connection.\n");

  recv(client_socket, buffer, sizeof(buffer), 0);

  /*Bunch of code here that interprets what was sent with some string manipulation 
  and serves back parts of a text file. No socket functions other than send() twice here*/

  recv(client_socket, buffer, sizeof(buffer), 0);

}

Идея, которую я имел в виду, заключалась в том, что, как только работа будет выполнена, подождите, пока клиент не закроет соединение, которое отправит сообщение длиной 0 (следовательно, recv() в конце), затем l oop возвращается к accept(), который принимает или ждет следующего соединения. Что мне здесь не хватает?

1 Ответ

1 голос
/ 05 апреля 2020

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

  client_socket = accept(client_socket, NULL, NULL);

Это нормально в первый раз. Но он пропускает дескриптор для сокета прослушивания. Таким образом, вы не можете принять другое соединение.

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