- •Основные сведения о компьютерных сетях
- •Базовые топологии сетей
- •Топология типа общая шина
- •Кольцевая топология сети
- •Звезда
- •Общие принципы построения сетей. Коммутация каналов и пакетов
- •Многопоточные приложения
- •Создание многопоточных приложений в Win32 API
- •Методы синхронизации потоков
- •Варианты заданий
- •Программирование сокетов
- •Использование классических блокирующих сокетов
- •Алгоритм работы сервера и клиента
- •Функции API сокетов
- •Варианты заданий
- •Контрольные вопросы
- •Архитектура и стандартизация сетей
- •Список литературы
- •Учебники по компьютерным сетям
- •Разработка сетевых приложений
- •Теоретические основы
|
|
Ю.В. Земсков. Вычислительные сети. Версия 0.20. — Санкт-Петербургский гос. университет гражданской авиации, 2012 |
|
|
|
|
|
37 |
ReceiverAddr.sin_addr.s_addr = inet_addr(argv[1]); // IP-адрес из командной строки. |
|
|
38 |
|
|
|
|
|
||
39 |
// Отсылаем дейтаграммы получателю: |
|
|
40 |
if ((Ret = sendto(SendingSocket,msg , lmsg, 0, |
|
|
41 |
(struct sockaddr *)&ReceiverAddr, |
|
|
42 |
sizeof(ReceiverAddr))) == SOCKET_ERROR) { |
|
|
43 |
printf("Ошибка sendto %i\n", WSAGetLastError()); |
|
|
|
|
|
|
44 |
closesocket(SendingSocket); |
|
|
45 |
WSACleanup(); exit(4); |
|
|
46 |
} |
|
|
47 |
|
|
|
48 |
printf("\nУспешно отослано %d байт сообщения\n%s\nполучателю %s:%d.\n", Ret, msg, |
|
|
49 |
inet_ntoa(ReceiverAddr.sin_addr), ntohs(ReceiverAddr.sin_port)); |
|
|
50 |
|
|
|
|
|
||
51 |
// Закрываем сокет: |
|
|
52 |
closesocket(SendingSocket); |
|
|
53 |
|
|
|
54 |
// Выгружаем библиотеку Winsock: |
|
|
55 |
WSACleanup(); |
|
|
56 |
|
|
|
|
|
||
57 |
printf("Нажмите любую клавишу...\n"); |
|
|
58 |
_getch(); |
|
|
59 |
return 0; |
|
|
60 |
} |
|
|
|
|
|
|
|
|
|
|
5.2. Варианты заданий
На основе рассмотренных листингов 2 и 3 реализуйте консольные приложения:
1.Однопоточный эхо-сервер, использующий блокирующие сокеты с установлением соединения. Сервер принимает запросы на подключение от любого клиента. Получив блок символов, он отсылает их обратно клиенту. После получения предопределённой последовательности символов сервер разрывает соединение и готов принимать запросы от новых клиентов.
2.Клиент для эхо-сервера из предыдущего варианта. Программа-клиент подключается к серверу и отсылает ему строки, вводимые пользователем с клавиатуры. После ввода пустой строки серверу отсылается спецальная строка, которая даёт команду на разрыв соединения.
3.Однопоточный эхо-сервер, использующий блокирующие сокеты с установлением соединения. Сервер принимает запросы на подключение от любого клиента. Получив блок символов, он отсылает их обратно клиенту. Разрыв соединения происходит по инициативе клиента. После разрыва соединения сервер готов принимать запросы от новых клиентов.
4.Клиент для эхо-сервера из предыдущего варианта. Программа-клиент подключается к серверу и отсылает ему строки, вводимые пользователем
склавиатуры. После ввода пустой строки клиент разрывает соединение.
—42 —
Ю.В. Земсков. Вычислительные сети. Версия 0.20. — Санкт-Петербургский гос. университет гражданской авиации, 2012
5.Однопоточный эхо-сервер, использующий блокирующие сокеты без установления соединения. Он принимает блоки символов от любых клиентов и отсылает им обратно те же символы, но преобразованные к противоположному регистру (строчные буквы становятся прописными,
апрописные — строчными; цифры и другие небуквенные символы не изменяются).
6.Клиент для эхо-сервера из предыдущего варианта.
5.3.Контрольные вопросы
1.Вопросы по листингу 2:
1.1.строки 7–9: в чём преимущество использования #define, не проще ли явно указывать значения параметров?
1.2.строка 18: зачем последним символом указан ’\0’?
1.3.строки 19, 56: что означает модификатор FAR?
1.4.строки 34, 40, 56, 69: что означает символ &?
1.5.строка 73: зачем мы записываем в буфер символ ’\0’?
1.6.строка 24: почему, в отличие от строк 31, 44, 53, 61, отсутствует вызов WSACleanup()?
1.7.строки 24, 31, 44, 53, 61: что означает аргумент 1 при вызове exit()?
2.Сравните строку 69 листинга 2 и строку 44 листинга 3. Почему в первом случае перед переменной buf стоит символ &, а во втором — нет?
3.Что будет, если в листингах 2 или 3:
3.1.изменить значение BUFNUM?
3.2.указать другой номер порта?
3.3.забыть указать один из вызовов WSACleanup()?
3.4.не вызвать функцию shutdown()?
3.5.не вызвать функцию closesocket()?
4.Строка 18 листинга 2 и строка 8 листинга 3: чем различаются две возможные записи символа ’\0’ и 0?
—43 —