- •Лабораторная работа №1
- •1.1. Цель и содержание работы
- •1.2. Основные конструкции языка c
- •Int X; // Переменная типа int
- •Int list[20]; // Массив целых величин
- •If (условие) оператор1 else оператор2
- •1.3. Функции ввода-вывода языка с
- •1.4. Создание консольного приложения
- •1.5. Меню интегрированной среды
- •1.6. Компиляция, отладка и запуск программы
- •1.7. Упражнения
- •Лабораторная работа №2
- •2.1. Цель и содержание работы
- •2.2. Использование функций библиотеки ipHlpApi
- •2.3. Упражнения
- •Int iErr; // Код ошибки
- •Лабораторная работа №3
- •3.1. Цель и содержание работы
- •3.2. Библиотека функций Winsock2
- •3.3. Структуры данных для работы с сокетами
- •3.4. Приложение-сервер
- •3.5. Приложение-клиент
- •3.6. Упражнения
- •Лабораторная работа №4
- •4.1. Цель и содержание работы
- •4.2. Функции для работы по протоколу udp
- •4.3. Приложение-сервер
- •4.4. Приложение-клиент
- •4.5. Упражнения
- •Лабораторная работа №5
- •5.1. Цель и содержание работы
- •5.2. Сканирование портов
- •5.3. Функции для определения состояния портов
- •5.4. Упражнения
- •Лабораторная работа №6
- •6.1. Цель и содержание работы
- •6.2. Сниффер
- •6.3. Упражнения
- •Библиографический список
4.4. Приложение-клиент
Рассмотрим порядок действий, которые должно выполнять приложение-клиент.
Первый шаг – инициализировать библиотеку Winsock.
Второй шаг – создать сокет с помощью функции socket.
Третий шаг – передача и прием сообщений с помощью функций recvfrom и sendto, пока не введено слово «quit».
Четвертый шаг – закрыть сокет.
Текст программы приведен в листинге 4.2. Программа продолжает работу, пока с клавиатуры не введено слово quit.
Листинг 4.2. UDP-клиент
#include "stdafx.h"
#include <string.h>
#include <winsock2.h>
#include <windows.h>
#define PORT 650
#define SERVERADDR "127.0.0.1"
int main(int argc, _TCHAR* argv[])
{
char buff[10240];
printf("UDP Client\nType quit to quit\n");
// Шаг 1 - иницилизация библиотеки Winsocks
if (WSAStartup(0x202, (WSADATA *)&buff[0]))
{
printf("WSAStartup error: %d\n", WSAGetLastError());
return -1;
}
// Шаг 2 - открытие сокета
SOCKET my_sock=socket(AF_INET, SOCK_DGRAM, 0);
if (my_sock==INVALID_SOCKET)
{
printf("socket() error: %d\n",WSAGetLastError());
WSACleanup(); return -2;
}
// Шаг 3 - обмен сообщениями с сервером
HOSTENT *hst;
sockaddr_in dest_addr;
dest_addr.sin_family=AF_INET;
dest_addr.sin_port=htons(PORT);
// Определение IP-адреса узла
if (inet_addr(SERVERADDR))
dest_addr.sin_addr.s_addr = inet_addr(SERVERADDR);
else
if (hst=gethostbyname(SERVERADDR))
dest_addr.sin_addr.s_addr =
((unsigned long **)hst->h_addr_list)[0][0];
else
{
printf("Unknown host: %d\n",WSAGetLastError());
closesocket(my_sock); WSACleanup(); return -3;
}
while(1)
{
// Чтение сообщения с клавиатуры
printf("S<=C:");
gets(buff);
if(!strcmp(buff,"quit")) break;
// Передача сообщений на сервер
sendto(my_sock, buff, strlen(buff)+1, 0,
(sockaddr *) &dest_addr, sizeof(dest_addr));
// Прием сообщения с сервера
sockaddr_in server_addr;
int server_addr_size=sizeof(server_addr);
int n=recvfrom(my_sock, buff, sizeof(buff), 0,
(sockaddr *) &server_addr, &server_addr_size);
if (n<=0)
{
printf("recvfrom() error: %d\n",WSAGetLastError());
closesocket(my_sock); WSACleanup(); return -4;
}
// Вывод принятого с сервера сообщения на экран
printf("S=>C:%s\n",buff);
}
// Шаг последний - выход
closesocket(my_sock);
WSACleanup();
return 0;
}
4.5. Упражнения
Требуется последовательно выполнить следующие действия:
Создать новое консольное приложение, ввести и скомпилировать программу-сервер.
Создать новое консольное приложение, ввести и скомпилировать программу-клиент.
Запустить сервер, а затем – клиента. В приложении-клиенте можно набирать некоторый текст на клавиатуре и после нажатия на Enter получать его обратно от сервера. Завершить работу клиента, набрав «quit», а затем завершить работу сервера, закрыв окно приложения.
Заменить у клиента «петлевой» адрес на IP-адрес одного из соседних компьютеров дисплейного класса. Запустить на одном компьютере сервер, на другом – клиента, и проверить их взаимодействие. Завершить работу клиента и сервера.
Примечание: для работы с библиотекой Winsock2 необходимо открыть свойства проекта (Properties) и в разделе Linker/Input добавить библиотеку ws2_32.lib в свойство Additional Dependencies.