UNIX: разработка сетевых приложений
Шрифт:
4 {
5 ssize_t n;
6 char buf[MAXLINE];
7 for (;;) {
8 if ((n = read(sockfd, buf, MAXLINE)) > 0)
9 return; /* соединение закрыто с другого конца */
10 Writen(sockfd, line, n);
11 }
12 }
Чтение
строки и ее отражение
7-11
Функция read
считывает очередную строку из сокета, после чего строка отражается обратно клиенту с помощью функции writen
. Если клиент закрывает соединение (нормальный сценарий), то при получении клиентского сегмента FIN функция дочернего процесса read
возвращает нуль. После этого происходит возврат из функции str_echo
и далее завершается дочерний процесс, приведенный в листинге 5.1. 5.4. Эхо-клиент TCP: функция main
В листинге 5.3 показана функция
main
TCP-клиента. Листинг 5.3. Эхо-клиент TCP
//tcpcliserv/tcpcli01.c
1 #include "unp.h"
2 int
3 main(int argc, char **argv)
4 {
5 int sockfd;
6 struct sockaddr_in servaddr;
7 if (argc != 2)
8 err_quit("usage: tcpcli <Ipaddress>");
9 sockfd = Socket(AF_INET, SOCK_STREAM, 0);
10 bzero(&servaddr. sizeof(servaddr));
11 servaddr.sin_family = AF_INET;
12 servaddr.sin_port = htons(SERV_PORT);
13 Inet_pton(AF_INET, argv[1], &servaddr.sin_addr);
14 Connect(sockfd, (SA*)&servaddr, sizeof(servaddr));
15 str_cli(stdin, sockfd); /* эта функция выполняет все необходимые
действия со стороны клиента */
16 exit(0);
17 }
Создание сокета, заполнение структуры его адреса
9-13
Создается сокет TCP и структура адреса сокета заполняется IP-адресом сервера и номером порта. IP-адрес сервера мы берем из командной строки, а известный номер порта сервера ( SERV_PORT
) —
unp.h
. Соединение с сервером
14-15
Функция connect
устанавливает соединение с сервером. Затем функция str_cli
(см. листинг 5.4) выполняет все необходимые действия со стороны клиента. 5.5. Эхо-клиент TCP: функция str_cli
Эта функция, показанная в листинге 5.4, обеспечивает отправку запроса клиента и прием ответа сервера в цикле. Функция считывает строку текста из стандартного потока ввода, отправляет ее серверу и считывает отраженный ответ сервера, после чего помещает отраженную строку в стандартный поток вывода.
Листинг 5.4. Функция str_cli: цикл формирования запроса клиента
//lib/str_cli.c
1 #include "unp.h"
2 void
3 str_cli(FILE *fp, int sockfd)
4 {
5 char sendline[MAXLINE], recvline[MAXLINE];
6 while (Fgets(sendline, MAXLINE, fp) != NULL) {
7 Writen(sockfd,. sendline, strlen(sendline));
8 if (Readline(sockfd, recvline, MAXLINE) == 0)
9 err_quit("str_cli: server terminated prematurely");
10 Fputs(recvline, stdout);
11 }
12 }
Считывание строки, отправка серверу
6-7
Функция fgets
считывает строку текста, а функция writen
отправляет эту строку серверу. Считывание отраженной сервером строки, запись в стандартный поток вывода
8-10
Функция readline
принимает отраженную сервером строку, а функция fputs
записывает ее в стандартный поток вывода. Возврат в функцию main
11-12
Цикл завершается, когда функция fgets
возвращает пустой указатель, что означает достижение конца файла или обнаружение ошибки. Наша функция-обертка Fgets
проверяет наличие ошибки, и если ошибка действительно произошла, прерывает выполнение программы. Таким образом, функция Fgets
возвращает пустой указатель только при достижении конца файла.
Поделиться:
Популярные книги
Стеллар. Трибут
2. Стеллар
Фантастика:
боевая фантастика
рпг
8.75
рейтинг книги
Его огонь горит для меня. Том 2
2. Мир Карастели
Фантастика:
юмористическая фантастика
5.40
рейтинг книги
На границе империй. Том 9. Часть 4
17. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
Наследник
1. Рюрикова кровь
Фантастика:
научная фантастика
попаданцы
альтернативная история
8.69
рейтинг книги

Совершенно несекретно
15. Девяностые
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Ваше Сиятельство 2
2. Ваше Сиятельство
Фантастика:
фэнтези
альтернативная история
аниме
5.00
рейтинг книги
Прометей: каменный век II
2. Прометей
Фантастика:
альтернативная история
7.40
рейтинг книги
Единственная для темного эльфа 3
3. Мир Верея. Драконья невеста
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Жандарм
1. Жандарм
Фантастика:
попаданцы
альтернативная история
аниме
4.11
рейтинг книги
Долгий путь домой
Вселенная EVE Online
Фантастика:
космическая фантастика
попаданцы
6.20
рейтинг книги
Прогрессор поневоле
2. Фараон
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Наследие Маозари 6
6. Наследие Маозари
Фантастика:
попаданцы
постапокалипсис
рпг
фэнтези
эпическая фантастика
5.00
рейтинг книги
Я еще не барон
1. Дорогой барон!
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Лолита
Проза:
классическая проза
современная проза
8.05