8.6. Эхо-клиент UDP: функция dg_cli

8.6. Эхо-клиент UDP: функция dg_cli

В листинге 8.4 показана функция dg_cli, которая выполняет большую часть работы на стороне клиента.

Листинг 8.4. Функция dg_cli: цикл обработки клиента

//lib/dg_cli.c

 1 #include "unp.h"

 2 void

 3 dg_cli(FILE *fp, int sockfd, const SA *pservaddr, socklen_t servlen)

 4 {

 5  int n;

 6  char sendline[MAXLINE], recvline[MAXLINE + 1];

 7  while (Fgets(sendline, MAXLINE, fp) != NULL) {

 8   Sendto(sockfd, sendline, strlen(sendline), 0, pservaddr, servlen);

 9   n = Recvfrom(sockfd, recvline, MAXLINE, 0, NULL, NULL);

10   recvline[n] = 0; /* завершающий нуль */

11   Fputs(recvline, stdout);

12  }

13 }

7-12 В цикле обработки на стороне клиента имеется четыре шага: чтение строки из стандартного потока ввода при помощи функции fgets, отправка строки серверу с помощью функции sendto, чтение отраженного ответа сервера с помощью функции recvfrom и помещение отраженной строки в стандартный поток вывода с помощью функции fputs.

Наш клиент не запрашивал у ядра присваивания динамически назначаемого порта своему сокету (тогда как для клиента TCP это имело место при вызове функции connect). В случае сокета UDP при первом вызове функции sendto ядро выбирает динамически назначаемый порт, если с этим сокетом еще не был связан никакой локальный порт. Как и в случае TCP, клиент может вызвать функцию bind явно, но это делается редко.

Обратите внимание, что при вызове функции recvfrom в качестве пятого и шестого аргументов задаются пустые указатели. Таким образом мы сообщаем ядру, что мы не заинтересованы в том, чтобы знать, кто отправил ответ. Существует риск, что любой процесс, находящийся как на том же узле, так и на любом другом, может отправить на IP-адрес и порт клиента дейтаграмму, которая будет прочитана клиентом, предполагающим, что это ответ сервера. Эту ситуацию мы рассмотрим в разделе 8.8.

Как и в случае функции сервера dg_echo, функция клиента dg_cli является не зависящей от протокола, но функция main клиента зависит от протокола. Функция main размещает в памяти и инициализирует структуру адреса сокета, относящегося к определенному типу протокола, а затем передает функции dg_cli указатель на структуру вместе с ее размером.

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

Программа-клиент

Из книги Бесплатные разговоры через Интернет автора Фрузоров Сергей

Программа-клиент Программа-клиент бесплатной версии Roger Wilco отличается тем, что в ее окне отсутствует вкладка Host Base Station (Обосноваться на базовой станции). Это естественно, поскольку сервер запускается отдельно и настраивается в режиме командной строки. Тем не менее,


Клиент

Из книги Введение в QNX/Neutrino 2. Руководство по программированию приложений реального времени в QNX Realtime Platform автора Кёртен Роб

Клиент Клиент, который желает послать запрос серверу, блокируется до тех пор, пока сервер не завершит обработку запроса. Затем, после завершения сервером обработки запроса, клиент разблокируется, чтобы принять «ответ».Это подразумевает обеспечение двух условий: клиент


DHCP-клиент

Из книги Недокументированные и малоизвестные возможности Windows XP автора Клименко Роман Александрович

DHCP-клиент Данная служба используется при существовании в сети DHCP-сервера. DHCP-сервер предназначен для выдачи всем компьютерам, не имеющим постоянного IP-адреса, временного IP-адреса, чтобы они могли работать в сети. Служба является отличным средством автоматизирования


DNS-клиент

Из книги UNIX: разработка сетевых приложений автора Стивенс Уильям Ричард

DNS-клиент Служба предназначена для получения IP-адреса удаленного компьютера при известном доменном или url-адресе этого компьютера (например, www.mail.ru). При этом процесс получения IP-адреса удаленного компьютера реализуется благодаря взаимодействию службы DNS-клиент с


Веб-клиент

Из книги автора

Веб-клиент Служба позволяет изменять или добавлять файлы, хранящиеся в Интернете. Если эта стандартная функция Windows вам не нужна, то службу лучше отключить.Служба Веб-клиент занимает около 800 Кбайт оперативной памяти и запускается с правами локальной службы (NT


5.4. Эхо-клиент TCP: функция main

Из книги автора

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


5.5. Эхо-клиент TCP: функция str_cli

Из книги автора

5.5. Эхо-клиент TCP: функция str_cli Эта функция, показанная в листинге 5.4, обеспечивает отправку запроса клиента и прием ответа сервера в цикле. Функция считывает строку текста из стандартного потока ввода, отправляет ее серверу и считывает отраженный ответ сервера, после чего


8.5. Эхо-клиент UDP: функция main

Из книги автора

8.5. Эхо-клиент UDP: функция main Функция main клиента UDP показана в листинге 8.3.Листинг 8.3. Эхо-клиент UDP//udpcliserv/udpcli01.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: udpcli <Ipaddress>"); 9  bzero(&servaddr, sizeof(servaddr));10  servaddr.sin_family = AF_INET;11  servaddr.sin_port =


8.12. Функция dg_cli (продолжение)

Из книги автора

8.12. Функция dg_cli (продолжение) Вернемся к функции dg_cli, показанной в листинге 8.4, и перепишем ее, с тем чтобы она вызывала функцию connect. В листинге 8.7 показана новая функция.Листинг 8.7. Функция dg_cli, вызывающая функцию connect//udpcliserv/dgcliconnect.c 1 #include "unp.h" 2 void 3 dg_cli(FILE *fp, int sockfd, const SA


16.4. Неблокируемая функция connect: клиент времени и даты

Из книги автора

16.4. Неблокируемая функция connect: клиент времени и даты В листинге 16.7 показана наша функция connect_nonb, вызывающая неблокируемую функцию connect. Мы заменяем вызов функции connect, имеющийся в листинге 1.1, следующим фрагментом кода:if (connect_nonb(sockfd, (SA*)&servaddr, sizeof(servaddr), 0) < 0)err_sys("connect


20.4. Функция dg_cli при использовании широковещательной передачи

Из книги автора

20.4. Функция dg_cli при использовании широковещательной передачи Мы еще раз изменим нашу функцию dg_cli, на этот раз дав ей возможность отправлять широковещательные сообщения стандартному серверу времени и даты UDP (см. табл. 2.1) и выводить все ответы. Единственное изменение,


21.8 Функция dg_cli, использующая многоадресную передачу

Из книги автора

21.8 Функция dg_cli, использующая многоадресную передачу Мы изменяем нашу функцию dg_cli, показанную в листинге 20.1, просто удаляя вызов функции setsockopt. Как мы сказали ранее, для отправки дейтаграмм многоадресной передачи не нужно устанавливать ни одного параметра сокета


30.3. Тестовый клиент TCP

Из книги автора

30.3. Тестовый клиент TCP В листинге 30.1[1] показан клиент, который будет использоваться для тестирования всех вариаций нашего сервера.Листинг 30.1. Код клиента TCP для проверки различных версий сервера//server/client.с 1 #include "unp.h" 2 #define MAXN 16384 /* максимальное количество байтов, которые