КОНСПЕКТ_ЛЕКЦИЙ_Сети_и_телекоммуникации (853866), страница 32
Текст из файла (страница 32)
char* text;
/* Сначала из сокета прочитать длину текстого сообщения. Если в качестве результата возвратиться 0,
то клиент закрыл соединение */
if (read (client_socket, &ength, 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 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, &name, 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;
}
Клиент-программа, представленная в листинге 13.2, соединяется с локальным сокетом и посылает сообщения. Путь к сокету и сообщения передаtтся через командную строку.
Листинг13.2 (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)
{
/* Записать в строку количество байт, включая NUL-терминал */
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;
}