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

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

Жанры

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

Фейт Сидни М.

Шрифт:

perror("Неверный socket клиента.");

exit(1);

}

/* 7. Обслужить клиента и закрыть соединение с ним. */

doTask(sockClient);

close(sockClient);

 }

}

/* Читать один поступивший буфер, распечатать некоторую информацию

 * и завершить работу. */

#define BUFLEN 81

int doTask(sockClient)

int sockClient;

{

 char buf[BUFLEN];

 int msgLength;

 /* 8.
Опустошение буфера и вызов recv

 * для получения сообщения от клиента. */

 bzero(buf, BUFLEN);

 if ((msgLength = recv(sockClient,buf, 80, 0)) < 0) {

perror("Неверное получение." );

exit(1);

 }

 printf("SERVER: Socket для клиента %d\n", sockClient);

 printf("SERVER: Длина сообщения %d\n", msgLength);

 printf("SERVER: Сообщение: %s\n\n", buf);

}

21.9 Интерфейс программирования socket для UDP

Мы познакомились с наиболее общим интерфейсом программирования TCP. Теперь рассмотрим программирование сервера и клиента UDP. На рис. 21.3 показана схема диалога UDP между клиентом и сервером. Вызовы socket и bind быстро выполняются и немедленно возвращают ответ. Вызов recvfrom предполагает режим блокирования по умолчанию, который можно изменить на неблокированный (т.е. асинхронный) режим.

Рис. 21.3. Типичные программные вызовы в socket UDP

21.10 Программа сервера UDP

Показанная ниже программа создает socket для UDP, связывает вызов с портом, а затем получает и распечатывает сообщения, которые посылаются на этот порт:

/* udpserv.c

 * Для запуска программы ввести "udpserv".

 *

 * Сначала включить стандартные заголовочные файлы. */

#include <sys/types.h>

#include <sys/socket.h>

#include <stdio.h>

#include <netinet/in.h>

#include <netdb.h>

#include <errno.h>

#define BUFLEN 81

main {

 int sockMain, addrLength, msgLength;

 struct sockaddr_in servAddr, clientAddr;

 char buf[BUFLEN];

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

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

perror("Сервер не может открыть socket для UDP.");

exit(1);

 }

 /* 2. Ввести информацию в структуру данных, используемую для хранения локальных

* IP-адресов и порта. Возложить на bind получение свободных портов. */

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

 servAddr.sin_family = AF_INET;

 servAddr.sin_addr.s_addr = htonl(INADDR_ANY);

 servAddr.sin_port = 0;

 /* 3. Вызвать bind, которая запишет номер используемого порта

* в TCB. */

 if (bind(sockMain, &servAddr, sizeof(servAddr))) {

perror("Вызов bind от сервера неудачен.");

exit(1);

 }

 /* 4. Извлекаем номер порта и используем функцию

* getsockname для копирования порта в servAddr. */

 addrLength = sizeof(servAddr);

 if ( getsockname(sockMain, &servAddr, &addrLength)) {

perror(Вызов getsockname неудачен.");

exit(1);

 }

 printf("SERVER: Номер порта is %d\n", ntohs(servAddr.sin_port));

 /* 5. Бесконечный цикл ожидания сообщений от клиентов. */

 for (;;) {

addrLength = sizeof(clientAddr);

bzero(buf, BUFLEN);

if ((msgLength = recvfrom(sockMain, buf, BUFLEN, 0, &clientAddr, &addrLength)) < 0) {

perror("Плохой socket клиента.");

exit(1);

}

/* 6. Распечатать клиентские IP-адрес и порт вместе с сообщением. */

printf("SERVER: IP-адрес клиента: %s\n",

inet_ntoa(clientAddr.sin_addr));

printf("SERVER: Порт клиента: %d\n",

ntohs(clientAddr.sin_port));

printf("SERVER: Длина сообщения %d\n", msgLength);

printf("SERVER: Сообщение: %s\n\n", buf);

 }

}

21.10.1 Вызовы в серверной программе UDP

1. sockMain = socket(AF_NET, SOCK_DGRAM, 0);

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

Клан

Русич Антон
2. Долгий путь домой
Фантастика:
боевая фантастика
космическая фантастика
5.60
рейтинг книги
Клан

Не кровный Брат

Безрукова Елена
Любовные романы:
эро литература
6.83
рейтинг книги
Не кровный Брат

На границе империй. Том 9. Часть 2

INDIGO
15. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 9. Часть 2

Последний Паладин. Том 2

Саваровский Роман
2. Путь Паладина
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Последний Паладин. Том 2

Кодекс Охотника. Книга XXI

Винокуров Юрий
21. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Охотника. Книга XXI

Кодекс Охотника. Книга XIII

Винокуров Юрий
13. Кодекс Охотника
Фантастика:
боевая фантастика
попаданцы
аниме
7.50
рейтинг книги
Кодекс Охотника. Книга XIII

Как я строил магическую империю 2

Зубов Константин
2. Как я строил магическую империю
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Как я строил магическую империю 2

Вдова на выданье

Шах Ольга
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Вдова на выданье

Пустоши

Сай Ярослав
1. Медорфенов
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Пустоши

Последний попаданец 5

Зубов Константин
5. Последний попаданец
Фантастика:
юмористическая фантастика
рпг
5.00
рейтинг книги
Последний попаданец 5

Заставь меня остановиться 2

Юнина Наталья
2. Заставь меня остановиться
Любовные романы:
современные любовные романы
6.29
рейтинг книги
Заставь меня остановиться 2

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

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

Эволюция мага

Лисина Александра
2. Гибрид
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Эволюция мага

Болотник 3

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