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

Листинг 5.11. (socket-client.c) Клиент локального сокета

Листинг 5.11. (socket-client.c) Клиент локального сокета

#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 name;
 /* Создание сокета. */
 socket_fd = socket(PF_LOCAL, SOCK_STREAM. 0);
 /* Сохранение имени сервера в адресной структуре. */
 name.sun_family = AF_LOCAL;
 strcpy(name.sun_path, socket_name);
 /* Подключение к серверному сокету. */
 connect(socket_fd, &name, SUN_LEN(&name));
 /* передача сообщения, заданного в командной строке. */
 write_text(socket_fd, message);
 close(socket_fd);
 return 0;
}

Прежде чем отравить текст сообщения, клиент записывает в сокет число (хранится в переменной length), определяющее длину сообщения в байтах. На противоположной стороне сервер выясняет длину сообщения и выделяет для него буфер соответствующего размера, после чего читает само сообщение.

Чтобы проверить этот пример, запустите в одном терминальном окне серверную программу, указав путь к сокету, например:

% ./socket-server /tmp/socket

В другом окне запустите несколько раз клиентскую программу, задав тот же путь к сокету плюс требуемое сообщение:

% ./socket-client /tmp/socket "Hello, world."
% ./socket-client /tmp/socket "This is a test."

Сервер получит и отобразит эти сообщения. Чтобы закрыть сервер, пошлите ему сообщение "quit":

% ./socket-client /tmp/socket "quit"

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


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