- •Лабораторна робота №1. Низькорівневий аналіз мережевого трафіку
- •1. Принципи роботи снифферов
- •2. Обмеження використання снифферов
- •3. Загальний огляд програмних пакетних снифферов
- •4. Аналізатор мережевого трафіку Wire Shark
- •4.1. Можливості Wireshark
- •4.2 Установка
- •4.3. Інтерфейс Wireshark
- •5. Завдання на лабораторну роботу і звітність, що надається
- •Лабораторна робота №2. Керування мережевим трафіком за допомогою файрволла
- •Теоретичні відомості
- •Comodo Firewall
- •Jetico Firewall
- •Tiny Personal Firewall
- •Контрольні питання
- •Індивідуальне завдання
- •Література
- •Лабораторна робота №3. Дослідження мережевих протоколів
- •3.1 Протокол ip
- •3.2 Фрагментація ip -пакетов
- •3.3 Базові утиліти для тестування мереж tcp/ip
- •3.4 Протоколи транспортного рівня
- •3.4.1 Функції транспортного рівня
- •3.4.2 Протокол udp
- •3.4.3 Протокол tcp
- •Контрольні питання
- •Індивідуальне завдання
- •Лабораторна робота №4. Реалізація обміну повідомленнями за допомогою протоколу udp
- •4.1 Постановка завдання
- •4.2 Коротка теоретична довідка
- •4.3 Схема взаємодії функцій WinSock
- •4.4 Реалізація клієнтської частини
- •4.7.2 Створення й видалення сокета
- •4.7.3 Прив'язка адреси до сокету
- •4.7.4 Очікування й обробка запитів на підключення клієнта
- •4.7.5 Підключення до сервера
- •4.7.6 Відправлення й прийом повідомлень
- •4.8 Рекомендації з виконання роботи
- •4.9 Контрольні питання
4.7.5 Підключення до сервера
Клієнт для з'єднання із сервером повинен використати функцію connect:
int connect(SOCKET s, const struct socketaddr FAR* name, int namelen);
де s - дескриптор сокета;
name - ідентифікатор адреси місця призначення (покажчик на структуру даних);
namelen - довжина цієї адреси.
Таким чином, функція connect повідомляє IP-адресу й номер порту віддаленій машині. Якщо адресне поле структури name містить нулі, функція connect поверне помилку WSAEADDRNOTAVAIL (або SOCKE T_ERROR=-1). Спроба підключення до сервера описана в наступному прикладі:
Var
ClientSocket : TSocket; ServerAddr : SockAddrIn; ErrConnect : integer;
begin
ServerAddr.sinfamily := AFINET;
ServerAddr.sin_port := htons(1024);
ServerAddr.sin_addr.s_addr := inetaddr(<IP-адреса сервера>);
ErrConnect := connect(ClientSocket, ServerAddr, SizeOf(ServerAddr));
If (ErrConnect <> 0) then
ShowMessage('Не можу підключитися до сервера')
Else
// Ваші подальші дії
end.
4.7.6 Відправлення й прийом повідомлень
Для відправлення повідомлень використовується функція send або sendto:
int send (SOCKET s, const char FAR* buf, int len, intflags),
де s - дескриптор сокета на вилученій машині;
buf - покажчик на масив символів, що підлягають пересиланню;
len - розмір другого параметра;
flgas - служить для цілей діагностики й керування передачею даних. Рекомендується прирівнювати його нулю.
Приклад розсилання повідомлень оператором send:
Var
Buf : array [0..255] of char; ErrSend : integer;
Begin
ErrSend := send(AcceptSocket, Buf, SizeOf(Buf), 0);
If (ErrSend = SOCKETERROR) then ShowMessage('Помилка передачі даних')
Else
// Ваші подальші дії
End.
Функція sendto служить для пересилання даних без установки з'єднання, тобто відправлення даних іде без підтвердження одержання даних:
int sendto (SOCKET s, const char FAR* buf, int len, int flags, const struct sockaddr FAR* to, int tolen);
де s - дескриптор відправника;
buf - покажчик на масив даних, призначених для пересиланню; len - розмір другого параметра;
flags - служить для цілей діагностики й керування передачею даних;
to - адресна структура сокета вилученої машини;
tolen - розмір адресної структури сокета вилученої машини.
Приклад посилки повідомлень функцією sendto:
Var
Buf : array [0..255] of char;
MySocket : TSocket; SendToAddr : SockAddrIn; ErrSendTo : ineteger;
Begin
ErrSenTo := sendto(MySocket, Buf, SizeOf(Buf), 0, SendToAddr, SizeOf(SendToAddr));
If (ErrSendTo = SOCKETERROR) then
ShowMessage('Помилка передачі даних')
Else
// Ваші подальші дії
End.
Для прийому повідомленнь застосовується функція recv або recvfrom. Функцію recvfrom так само, як і sendto, можна застосовувати, не з'єднуючись із відправником.
int recv (SOCKET s, char FAR* buf, int len, int flags);
де s - дескриптор сокета одержувача;
buf - покажчик на масив отриманих даних;
len - розмір другого параметра;
flags - служить для цілей діагностики й керування передачею даних.
Приклад прийому повідомлень функцією recv:
Var
Buf : array [0..255] of char; MySock : TSocket; ErrRecv : integer;
Begin
ErrRecv := recv(MySock, buf, SizeOf(Buf), 0);
If (ErrRecv = SOCKETERROR) then
ShowMessage^ можу прийняти повідомлення')
Else
// Ваші подальші дії
End.
int recvfrom (SOCKET s, const char FAR* buf, int len, int flags, const struct sockaddr FAR* to, int tolen);
де s - дескриптор одержувача;
buf - покажчик на масив отриманих даних;
len - розмір другого параметра;
flags - служить для цілей діагностики й керування передачею даних;
to - адресна структура сокета віддаленої машини;
tolen - розмір адресної структури сокета віддаленої машини.
Приклад прийом повідомлень, використовуючи функцію recvfrom:
Var
Buf : array [0..255] of char;
MySocket : TSocket;
RecvFromAddr : SockAddrIn;
ErrRecvFrom : ineteger;
Begin
ErrRecvFrom := recvfrom(MySocket, Buf, SizeOf(Buf), 0, RecvFromAddr, SizeOf(RecvFromAddr));
If (ErrRecvFrom = SOCKETERROR) then
ShowMessage('Не можу прийняти повідомлення')
Else
// Ваші подальші дії
End.