Книга: TCP/IP Архитектура, протоколы, реализация (включая IP версии 6 и IP Security)

21.11 Клиентская программа UDP

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

udpclient plum.cs.yale.edu 2315 "Это сообщение."
/* udpclient.с
 * Перед запуском клиента следует запустить сервер.
 * Далее нужно получить порт сервера.
 * Для запуска клиента ввести:
 * udpclient имя_хоста порт сообщение */
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <stdio.h>
#include <errno.h>
main(argc, argv)
 int argc;
 char *argv[]; /* Это вводимые пользователем аргументы. */
               /* argv[0] - имя программы. argv[1] указывает на имя хоста. */
               /* argv[2] ссылается на порт, */
               /* а argv [3] ссылается на текстовое сообщение. */
{
 int sock;
 struct sockaddr_in, servAddr, clientAddr;
 struct hostent *hp, *gethostbyname();
 /* Должно быть четыре аргумента. */
 if (argc < 4) {
  printf ("ВВЕСТИ udpclient имя_хоста порт сообщениеn");
  exit(1);
 }
 /* 1. Создать socket для UDP. */
 if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
  perror("He получен socketn");
  exit(1);
 }
 /* 2. Занести адрес и порт сервера в servAddr.
  * Сначала заполнить адресную структуру нулями.
  * Использовать функцию gethostbyname для получения имени хоста
  * и его IP-адреса. Затем скопировать IP-адрес
  * в servAddr функцией bcopy.
  * Наконец занести номер порта из argv[2]. */
 bzero((char *)&servAddr, sizeof(servAddr));
 servAddr.sin_family = AF_INET;
 hp = gethostbyname(argv[1]);
 bcopy(hp->h_addr, &servAddr.sin_addr, hp->h_length);
 servAddr.sin_port = htons(atoi(argv[2]));
 /* 3. Вызвать bind для получения порта UDP. Система
  * назначает свободный порт. */
 bzero((char *)&clientAddr, sizeof(clientAddr));
 clientAddr.sin_family = AF_INET;
 clientAddr.sin_addr.s_addr = htonl(INADDR_ANY);
 clientAddr.sin_port = 0;
 if (bind(sock, &clientAddr, sizeof(clientAddr)) < 0) {
  perror("Клиент не получил порт.n");
  exit(1);
 }
 /* 4. Клиент анонсирует свою готовность к приему сообщений.
  * Он посылает сообщение и распечатывает последнюю строку. */
 printf ("CLIENT: Готов к пересылкеn");
 if (sendto(sock, argv[3], strlen(argv[3]), 0, &servAddr, sizeof(servAddr)) < 0) {
  perror "Проблема с sendto.n");
  exit(1);
 }
 printf ("CLIENT: Пересылка закончена. Счастливо.n");
 /* Закрытие socket */
 close(sock);
}

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

Оглавление статьи/книги

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