Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Zemskov_compnets.pdf
Скачиваний:
133
Добавлен:
18.04.2015
Размер:
705.68 Кб
Скачать

 

 

Ю.В. Земсков. Вычислительные сети. Версия 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 —

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]