commit 4bbfbd5947ef4dae50b325d8c49b18a2437774c0
Author: Дмитрий <stud179126@vyatsu.ru>
Date:   Tue Apr 1 17:40:17 2025 +0300

    lab3, нужно читать README.md

diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..1bccbe1
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,7 @@
+.venv
+.idea
+/venv
+.venv/
+.env
+*.token
+.env/
\ No newline at end of file
diff --git a/API.py b/API.py
new file mode 100644
index 0000000..d672370
--- /dev/null
+++ b/API.py
@@ -0,0 +1,66 @@
+import os
+from dotenv import load_dotenv
+import requests
+
+# 1. Загрузка токена
+load_dotenv()
+TOKEN = os.getenv("GITEA_TOKEN")
+
+if not TOKEN:
+    print("ОШИБКА: Токен не найден в .env файле!")
+    print("Убедитесь, что в папке с скриптом есть файл .env с содержимым:")
+    print("GITEA_TOKEN=ваш_токен_здесь")
+    exit(1)
+
+headers = {"Authorization": f"token {TOKEN}"}
+
+# 2. Проверка токена
+print("Проверяем токен...")
+try:
+    user_info = requests.get(
+        "https://git.vyatsu.ru/api/v1/user",
+        headers=headers,
+        timeout=10
+    )
+    user_info.raise_for_status()  # Проверит HTTP ошибки
+
+    # Проверка структуры ответа
+    if not user_info.json().get("login"):
+        print("Неожиданный формат ответа от API:")
+        print(user_info.json())
+        exit(1)
+
+    print(f"Токен работает. Ваш логин: {user_info.json()['login']}")
+
+except Exception as e:
+    print(f"ОШИБКА при проверке токена: {e}")
+    print("Ответ сервера:", user_info.text if 'user_info' in locals() else "Нет ответа")
+    exit(1)
+
+# 3. Создание issue
+print("\nПытаемся создать issue...")
+repo_owner = "stud179126"
+repo_name = "lab3"
+
+new_issue = {
+    "title": "Тестовый issue из Python",
+    "body": "Этот issue создан через API скриптом!"
+}
+
+try:
+    response = requests.post(
+        f"https://git.vyatsu.ru/api/v1/repos/{repo_owner}/{repo_name}/issues",
+        headers=headers,
+        json=new_issue,
+        timeout=10
+    )
+
+    if response.status_code == 201:
+        print("✅ Issue успешно создан!")
+        print("Ссылка:", response.json().get("html_url", "не найдена"))
+    else:
+        print(f"❌ Ошибка {response.status_code}:")
+        print(response.text)
+
+except Exception as e:
+    print(f"ОШИБКА при создании issue: {e}")
\ No newline at end of file
diff --git a/HTTP - соединение в vyatsu.ru .jpg b/HTTP - соединение в vyatsu.ru .jpg
new file mode 100644
index 0000000..e82a8e6
Binary files /dev/null and b/HTTP - соединение в vyatsu.ru .jpg differ
diff --git a/HTTP_request.py b/HTTP_request.py
new file mode 100644
index 0000000..6339fc3
--- /dev/null
+++ b/HTTP_request.py
@@ -0,0 +1,31 @@
+import socket
+import ssl
+
+# Создаём соединение
+client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+secure_client = ssl.create_default_context().wrap_socket(
+    client, server_hostname='vyatsu.ru'
+)
+secure_client.connect(('vyatsu.ru', 443))
+
+# HTTP-запрос с заголовками
+request = (
+    "GET / HTTP/1.1\r\n"
+    "Host: vyatsu.ru\r\n"
+    "User-Agent: python-requests/2.28.1\r\n"
+    "Accept: */*\r\n"
+    "Accept-Encoding: gzip, deflate\r\n"
+    "Connection: keep-alive\r\n"
+    "\r\n"
+)
+secure_client.sendall(request.encode())
+
+# Получаем и распаковываем ответ
+response = secure_client.recv(8192)
+headers, body = response.split(b'\r\n\r\n', 1)
+
+
+print(headers.decode())
+print(body.decode())
+
+secure_client.close()
\ No newline at end of file
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..5d3214a
--- /dev/null
+++ b/README.md
@@ -0,0 +1,4 @@
+Сделан захват пакетов TCP  и изменён код клиента/сервера для ручного отключения
+Установлено UDP соединение , в отличаии от TCP тут мы отправляем запрос в один путь и не ждем ответа ,мы не узнаем дойдёт он или нет,т.к никаких ошибок не увидим.
+Использовал requests и socket для сравнения 
+API - написан скрипт(API.py) ,который создаёт issues (задачи)
\ No newline at end of file
diff --git a/TCP - Sequence Number, Sequence Number (raw), Acknowledgment Number, Acknowledgment Number (raw), Flags..jpg b/TCP - Sequence Number, Sequence Number (raw), Acknowledgment Number, Acknowledgment Number (raw), Flags..jpg
new file mode 100644
index 0000000..d3f0173
Binary files /dev/null and b/TCP - Sequence Number, Sequence Number (raw), Acknowledgment Number, Acknowledgment Number (raw), Flags..jpg differ
diff --git a/TCP - завершение соединения 1.jpg b/TCP - завершение соединения 1.jpg
new file mode 100644
index 0000000..d85a544
Binary files /dev/null and b/TCP - завершение соединения 1.jpg differ
diff --git a/TCP_Client.py b/TCP_Client.py
new file mode 100644
index 0000000..51f58c8
--- /dev/null
+++ b/TCP_Client.py
@@ -0,0 +1,16 @@
+import socket
+
+client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+client.connect(('127.0.0.1', 10000))
+
+while True:
+    message = input("Введите сообщение (или 'e' для выхода): ")
+    if message.lower() == 'e':
+        client.sendall(b'EXIT')  # Отправляем серверу команду на завершение
+        break
+    else:
+        client.sendall(message.encode())
+        data = client.recv(1024)
+        print(f"Ответ от сервера: {data.decode()}")
+
+client.close()
\ No newline at end of file
diff --git a/TCP_Server.py b/TCP_Server.py
new file mode 100644
index 0000000..90fcd8b
--- /dev/null
+++ b/TCP_Server.py
@@ -0,0 +1,28 @@
+import socket
+
+server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+server.bind(("0.0.0.0", 10000))
+server.listen(1)
+print("TCP сервер запущен")
+
+while True:
+    conn, addr = server.accept()
+    print(f"Подключение от {addr}")
+
+    data = conn.recv(1024)
+    if not data:
+        conn.close()
+        continue
+
+    print(f"Получено: {data.decode()}")
+
+    if data.upper() == b'EXIT':
+        conn.sendall(b"Server shutting down...")
+        conn.close()
+        break  # Выходим из цикла и завершаем сервер
+
+    conn.sendall(data.upper())
+    conn.close()
+
+server.close()  # Закрываем серверный сокет
+print("Сервер остановлен")
\ No newline at end of file
diff --git a/UDP - соединение (мод).jpg b/UDP - соединение (мод).jpg
new file mode 100644
index 0000000..8204923
Binary files /dev/null and b/UDP - соединение (мод).jpg differ
diff --git a/UDP - соединение (просто 1 запрос).jpg b/UDP - соединение (просто 1 запрос).jpg
new file mode 100644
index 0000000..eb02531
Binary files /dev/null and b/UDP - соединение (просто 1 запрос).jpg differ
diff --git a/UDP_Client.py b/UDP_Client.py
new file mode 100644
index 0000000..1fca3b1
--- /dev/null
+++ b/UDP_Client.py
@@ -0,0 +1,14 @@
+import socket
+
+client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
+
+while True:
+    message = input("Введите сообщение (или 'exit' для выхода): ")
+    if message.lower() == 'exit':
+        break
+
+    client.sendto(message.encode(), ('127.0.0.1', 20000))  # Новый порт 20000
+    data, _ = client.recvfrom(1024)
+    print(f"Ответ от сервера: {data.decode()}")
+
+client.close()
\ No newline at end of file
diff --git a/UDP_Server.py b/UDP_Server.py
new file mode 100644
index 0000000..9d5b0bd
--- /dev/null
+++ b/UDP_Server.py
@@ -0,0 +1,16 @@
+import socket
+
+server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
+server.bind(('0.0.0.0', 20000))  # Новый порт 20000
+print("UDP сервер запущен на порту 20000")
+
+while True:
+    data, addr = server.recvfrom(1024)
+    decoded_data = data.decode()
+    print(f"Получено от {addr}: {decoded_data}")
+
+    # Модификация данных:
+    modified_data = decoded_data.upper().replace('O', '0')  # Замена 'O' на '0'
+    response = f"MODIFIED: {modified_data}"  # Добавляем префикс
+
+    server.sendto(response.encode(), addr)
\ No newline at end of file
diff --git a/requirements.txt b/requirements.txt
new file mode 100644
index 0000000..9ad0c89
Binary files /dev/null and b/requirements.txt differ
diff --git a/Изменение - Измените TCP-клиент так, чтобы TCP-сервер завершил работу..jpg b/Изменение - Измените TCP-клиент так, чтобы TCP-сервер завершил работу..jpg
new file mode 100644
index 0000000..1c81a13
Binary files /dev/null and b/Изменение - Измените TCP-клиент так, чтобы TCP-сервер завершил работу..jpg differ