/* 6. Распечатать клиентские IP-адрес и порт вместе с сообщением. */
printf('SERVER: IP-адрес клиента: %s
',
inet_ntoa(clientAddr.sin_addr));
printf('SERVER: Порт клиента: %d
',
ntohs(clientAddr.sin_port));
printf('SERVER: Длина сообщения %d
', msgLength);
printf('SERVER: Сообщение: %s
', buf);
}
}
21.10.1 Вызовы в серверной программе UDP
1.
Семейство адресов — снова Интернет.
2.
Вызовы инициализации адресной структуры сервера те же, что и в программе для TCP.
3.
Как и прежде,
4.
Использовать
5.
Вызов
recvfrom(дескриптор_socket, входной_буфер, длина_буфера, флаги, исходная_адресная_структура, указатель_на_длину_исходной_адресной_структуры)
Флаги позволяют вызывающей стороне просмотреть сообщение без его фактического получения. После возвращения исходная адресная структура заполняется IP-адресом и номером порта клиента. Необходим указатель на длину исходного адреса, поскольку она может быть изменена при вставке в поле фактического адреса клиента.
6.
Этот вызов преобразует 32-разрядный адрес Интернета клиента в знакомую нам нотацию этого адреса с точками и десятичными значениями.
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. Система
* назначает свободный порт. */