Я работаю над этим календарем / напоминаниями сервер-клиент. Я наткнулся на ошибку, из-за которой, возможно, неправильно понял поведение функции 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()
, который принимает или ждет следующего соединения. Что мне здесь не хватает?