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

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

Жанры

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

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

Газлайтер. Том 10

Володин Григорий
10. История Телепата
Фантастика:
боевая фантастика
5.00
рейтинг книги
Газлайтер. Том 10

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

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

Звездная Кровь. Изгой

Елисеев Алексей Станиславович
1. Звездная Кровь. Изгой
Фантастика:
боевая фантастика
попаданцы
рпг
5.00
рейтинг книги
Звездная Кровь. Изгой

Хозяин Теней 4

Петров Максим Николаевич
4. Безбожник
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Хозяин Теней 4

Картофельное счастье попаданки

Иконникова Ольга
Фантастика:
фэнтези
5.00
рейтинг книги
Картофельное счастье попаданки

Экзорцист: Проклятый металл. Жнец. Мор. Осквернитель

Корнев Павел Николаевич
Фантастика:
фэнтези
героическая фантастика
5.50
рейтинг книги
Экзорцист: Проклятый металл. Жнец. Мор. Осквернитель

Доктора вызывали? или Трудовые будни попаданки

Марей Соня
Фантастика:
юмористическая фантастика
попаданцы
5.00
рейтинг книги
Доктора вызывали? или Трудовые будни попаданки

Метатель

Тарасов Ник
1. Метатель
Фантастика:
боевая фантастика
попаданцы
рпг
фэнтези
фантастика: прочее
постапокалипсис
5.00
рейтинг книги
Метатель

Моя на одну ночь

Тоцка Тала
Любовные романы:
современные любовные романы
короткие любовные романы
5.50
рейтинг книги
Моя на одну ночь

Чехов. Книга 2

Гоблин (MeXXanik)
2. Адвокат Чехов
Фантастика:
фэнтези
альтернативная история
аниме
5.00
рейтинг книги
Чехов. Книга 2

Хозяин Теней 2

Петров Максим Николаевич
2. Безбожник
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Хозяин Теней 2

Сумеречный стрелок 7

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

Жизнь под чужим солнцем

Михалкова Елена Ивановна
Детективы:
прочие детективы
9.10
рейтинг книги
Жизнь под чужим солнцем

Красноармеец

Поселягин Владимир Геннадьевич
1. Красноармеец
Фантастика:
боевая фантастика
попаданцы
4.60
рейтинг книги
Красноармеец