Необходимо исправить программу сервер так, чтобы она завершалась после ввода quit со стороны клиента

Убирал ! у условия с strcmp, но все равно сервер не закрывался.

#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("%s\n", 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 addr;
 int client_sent_quit_message;

 unlink(socket_name);
 memset(&addr, 0, sizeof(addr));
 
 /* Создание локального сокета. */
 socket_fd = socket(PF_UNIX, SOCK_STREAM, 0);
 /* Переход в режим сервера. */
 addr.sun_family = AF_UNIX;
 strcpy(addr.sun_path, socket_name);
 if (bind(socket_fd, (struct sockaddr *)&addr, sizeof(&addr)) < 0) { 
      perror("bind");
      exit(1);
 }
 /* Ожидание запросов. */
 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, (struct sockaddr *)&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;
}

Клиент:

 #include <stdio.h>
    #include <string.h>
    #include <sys/socket.h>
    #include <sys/un.h>
    #include <unistd.h>
    
    /* Запись строки TEXT в сокет, заданный
       дескриптором SOCKET_FD. */
    void write_text(int socket_fd, const char *text)
    {
        /* Сначала указывается число байтов в строке, включая
           завершающий символ NULL. */
        int length = strlen(text) + 1;
        write(socket_fd, &length, sizeof(length));
        /* Запись строки. */
        write(socket_fd, text, length);
    }
    
    int main(int argc, char *const argv[])
    {
        const char *const socket_name = argv[1];
        const char *const message = argv[2];
        int socket_fd;
        struct sockaddr_un addr;
        
        memset(&addr, 0, sizeof(addr));
        
        /* Создание сокета. */    
        socket_fd = socket(PF_UNIX, SOCK_STREAM, 0);
    
        /* Сохранение имени сервера в адресной структуре. */
        addr.sun_family = AF_UNIX;
        strcpy(addr.sun_path, socket_name);
        /* Подключение к серверному сокету. */
        connect(socket_fd, (struct sockaddr *)&addr, sizeof(&addr));
        /* передача сообщения, заданного в командной строке. */
        write_text(socket_fd, message);
        close(socket_fd);
        return 0;
    }

Ответы (0 шт):