Теперь разберемся, что есть что. Сначала мы определяем некоторые макросы: номер порта, который будет прослушивать сервер, размер буфера передаваемых данных и текст запроса клиенту.
означает, что мы будем прослушивать сокет sock1 (порт 1234) и максимальное число клиентов не должно превышать 3.
Как и любой нормальный сервер, мы должны работать в бесконечном цикле, постоянно обрабатывая запросы клиентов. В бесконечном цикле мы:
1. получаем размер структуры client
ans_len = sizeof(client);
2. создаем сокет sock2, через который будем обмениваться данными с клиентом. Если в очереди listen нет клиентов, мы переходим в состояние ожидания
sock2 = accept(sock1, &client, &ans_len);
3. как только подключится клиент, мы отправим ему сообщение MSG_TO_SEND
write(sock2, MSG_TO_SEND, sizeof(MSG_TO_SEND));
4. увеличиваем счетчик клиентов
total+=1;
5. получаем размер прочитанных данных, сами данные записываются в буфер buffer
ans_len = read(sock2, buffer, BUF_SIZE);
6. выводим прочитанные данные на стандартный вывод
write(1, buffer, ans_len);
7. завершаем сеанс связи
shutdown(sock2, 0);
8. закрываем сокет
close(sock2);
Конечно, любой нормальный сервер при поступлении определенных сигналов, например, SIG_HUP, должен корректно перезапуститься или вообще завершить работу. Наш сервер этого не делает — обработку сигналов, я надеюсь, вы можете добавить сами.
Теперь мы можем откомпилировать нашу программу:
$ gcc -о server server.c
Запускаем:
./server
Программа перешла в состояние ожидания новых клиентов.