Необходимо исправить программу сервер так, чтобы она завершалась после ввода 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;
}