Чтение онлайн

на главную - закладки

Жанры

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

Фейт Сидни М.

Шрифт:

Семейство адресов — снова Интернет.

2. bzero((char *)&servAddr, sizeof(servAddr));

servAddr.sin_family = AF_INET;

servAddr.sin_addr.s_addr = htonl(INADDR_ANY);

servAddr.sin_port = 0;

Вызовы инициализации адресной структуры сервера те же, что и в программе для TCP.

3. bind(sockMain, &servAddr, sizeof(servAddr));

Как и прежде, bind

получает порт для сервера и записывает значения в TCB. Конечно, по сравнению с TCP, UDP содержит очень мало информации.

4. getsockname(sockMain, &servAddr, &length);

Использовать getsockname, чтобы извлечь присвоенный socket порт.

5. msgLength = recvfrom(sockMain, buf, BUFLEN, 0, &clientAddr, &length);

Вызов recvfrom имеет форму:

recvfrom(дескриптор_socket, входной_буфер, длина_буфера, флаги, исходная_адресная_структура, указатель_на_длину_исходной_адресной_структуры)

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

6. inet_ntoa(clientAddr.sin_addr);

Этот вызов преобразует 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 имя_хоста порт сообщение\n");

exit(1);

 }

 /* 1. Создать socket для UDP. */

 if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {

perror("He получен socket\n");

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");

Поделиться:
Популярные книги

Белые погоны

Лисина Александра
3. Гибрид
Фантастика:
фэнтези
попаданцы
технофэнтези
аниме
5.00
рейтинг книги
Белые погоны

Черный дембель. Часть 1

Федин Андрей Анатольевич
1. Черный дембель
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Черный дембель. Часть 1

Лишняя дочь

Nata Zzika
Любовные романы:
любовно-фантастические романы
8.22
рейтинг книги
Лишняя дочь

Темный Лекарь 5

Токсик Саша
5. Темный Лекарь
Фантастика:
фэнтези
аниме
5.00
рейтинг книги
Темный Лекарь 5

Последний из рода Демидовых

Ветров Борис
Фантастика:
детективная фантастика
попаданцы
аниме
5.00
рейтинг книги
Последний из рода Демидовых

Чиновникъ Особых поручений

Кулаков Алексей Иванович
6. Александр Агренев
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Чиновникъ Особых поручений

Попаданка в академии драконов 4

Свадьбина Любовь
4. Попаданка в академии драконов
Любовные романы:
любовно-фантастические романы
7.47
рейтинг книги
Попаданка в академии драконов 4

Боги, пиво и дурак. Том 6

Горина Юлия Николаевна
6. Боги, пиво и дурак
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Боги, пиво и дурак. Том 6

Курсант: Назад в СССР 10

Дамиров Рафаэль
10. Курсант
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Курсант: Назад в СССР 10

Сделай это со мной снова

Рам Янка
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Сделай это со мной снова

Болотник 2

Панченко Андрей Алексеевич
2. Болотник
Фантастика:
попаданцы
альтернативная история
6.25
рейтинг книги
Болотник 2

Камень Книга двенадцатая

Минин Станислав
12. Камень
Фантастика:
боевая фантастика
городское фэнтези
аниме
фэнтези
5.00
рейтинг книги
Камень Книга двенадцатая

Небо для Беса

Рам Янка
3. Самбисты
Любовные романы:
современные любовные романы
5.25
рейтинг книги
Небо для Беса

Надуй щеки! Том 4

Вишневский Сергей Викторович
4. Чеболь за партой
Фантастика:
попаданцы
уся
дорама
5.00
рейтинг книги
Надуй щеки! Том 4