Книга: Программирование для Linux. Профессиональный подход

Листинг 5.10. (socket-server.c) Сервер локального сокета

Листинг 5.10. (socket-server.c) Сервер локального сокета

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <unistd.h>
/* Чтение сообщений из сокета и вывод их на экран. Функция
   продолжает работу до тех пор, пока сокет не будет закрыт.
   Функция возвращает 0, если клиент послал сообщение "quit",
   в противном случае возвращается ненулевое значение. */
int server(int client_socket) {
 while (1) {
  int length;
  char* text;
  /* Сначала читаем строку, в которой записана длина сообщения.
     Если возвращается 0, клиент закрыл соединение. */
  if (read(client_socket, &length, sizeof(length)) == 0)
   return 0;
  /* Выделение буфера для хранения текста. */
  text = (char*)malloc(length);
  /* Чтение самого сообщения и вывод его на экран. */
  read(client_socket, text, length);
  printf("%sn", text);
  /* Очистка буфера. */
  free(text);
  /* Если клиент послал сообщение "quit.", работа сервера
     завершается. */
  if (!strcmp(text, "quit"))
   return 1;
 }
}
int main(int argc, char* const argv[]) {
 const char* const socket_name = argv[1];
 int socket_fd;
 struct sockaddr_un name;
 int client_sent_quit_message;
 /* Создание локального сокета. */
 socket_fd = socket(PF_LOCAL, SOCK_STREAM, 0);
 /* Переход в режим сервера. */
 name.sun_family = AF_LOCAL;
 strcpy(name.sun_path, socket_name);
 bind(socket_fd, SUN_LEN(&name));
 /* Ожидание запросов. */
 listen(socket_fd, 5);
 /* Непрерывный прием запросов на подключение. Для каждого
    клиента вызывается функция server(). Цикл продолжается,
    пока не будет получено сообщение "quit". */
 do {
  struct sockaddr_un client_name;
  socklen_t client_name_len;
  int client_socket_fd;
  /* Прием запроса. */
  client_socket_fd =
   accept(socket_fd, &client_name, &client_name_len);
  /* Обработка запроса. */
  client_sent_quit_message = server(client_socket_fd);
  /* Закрытие серверной стороны соединения. */
  close(client_socket_fd);
 } while(!client_sent_quit_message);
 /* Удаление файла локального сокета. */
 close(socket_fd);
 unlink(socket_name);
 return 0;
}

Клиентская программа, показанная в листинге 5.11, подключается к локальному сокету и посылает сообщение. Путевое имя сокета и текст сообщения задаются в командной строке.

Оглавление книги


Генерация: 0.096. Запросов К БД/Cache: 0 / 0
поделиться
Вверх Вниз