Книга: Программирование для 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, подключается к локальному сокету и посылает сообщение. Путевое имя сокета и текст сообщения задаются в командной строке.
- 5.5.5. Примеры программ, работающих с локальными сокетами
- Листинг 5.11. (socket-client.c) Клиент локального сокета
- 4.2. Функция socket
- Запуск InterBase-сервера
- Расширенная установка InterBase-сервера
- Листинг 10.1. (simpleid.c) Отображение идентификаторов пользователя и группы
- Совместимость клиентов и серверов различных версий
- Тестирование Web-сервиса XML с помощью WebDev.WebServer.exe
- Статистика InterBase-сервера
- Сервер для InterBase
- InterBase Super Server для Windows
- Каталог BIN в SuperServer