21.11 Клиентская программа UDP
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 имя_хоста порт сообщение ");
exit(1);
}
/* 1. Создать socket для UDP. */
if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
perror("He получен socket ");
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("Клиент не получил порт. ");
exit(1);
}
/* 4. Клиент анонсирует свою готовность к приему сообщений.
* Он посылает сообщение и распечатывает последнюю строку. */
printf ("CLIENT: Готов к пересылке ");
if (sendto(sock, argv[3], strlen(argv[3]), 0, &servAddr, sizeof(servAddr)) < 0) {
perror "Проблема с sendto. ");
exit(1);
}
printf ("CLIENT: Пересылка закончена. Счастливо. ");
/* Закрытие socket */
close(sock);
}