From ade90833d10efa7981a74a089909e11ca8929809 Mon Sep 17 00:00:00 2001 From: DamirDenis-Tudor Date: Tue, 16 Jan 2024 20:32:06 +0200 Subject: [PATCH] doc: POC app doc + sources --- README.md | 18 +++++++++++++++++- arhitecture/demo/capture.pcapng | Bin 0 -> 415700 bytes 2 files changed, 17 insertions(+), 1 deletion(-) create mode 100755 arhitecture/demo/capture.pcapng diff --git a/README.md b/README.md index 04a756f..e46f948 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ 2) [Slower flow](#standard-like-flow) 3) [Faster flow](#faster-flow-methodpersonal-advice) 3) [POC arhitecture implementation](#3-poc-arhitecture-implementation) - 1) [Demo video](#key-concepts) +3) [Sources](#4-sources) # 1. Architecture Design @@ -184,3 +184,19 @@ Client: 2.31 Continue # 3. POC arhitecture implementation +## I. Implementation notes +- This implementation adheres to the described architecture. It serves as a proof of concept, but for a serious implementation, it's recommended to use CPython, C++, or another high-speed language. +- This is an example of a command-based share drive application implemented in Python. However, the language choice introduces poor packet managing speed. A significant challenge with using Python is the Global Interpreter Lock (GIL), which can hinder concurrent execution of CPU-bound tasks. + +## II. Demo video +[demo.webm](https://github.com/DamirDenis-Tudor/Cyberpunk-Platformer/assets/101417927/19c17b6b-2465-4562-a920-f6287d4eed4a) + +## III. WireShark Capture +[Download capture.pcapng](arhitecture/demo/capture.pcapng) + +# 4. Sources: +- https://datatracker.ietf.org/doc/html/rfc7252 +- https://datatracker.ietf.org/doc/html/rfc7959 +- https://docs.python.org/3.11/ +- https://realpython.com/python-parallel-processing/ +- https://chat.openai.com/ \ No newline at end of file diff --git a/arhitecture/demo/capture.pcapng b/arhitecture/demo/capture.pcapng new file mode 100755 index 0000000000000000000000000000000000000000..8ff56bff70c802cb3e419d9440deab4883a0bd38 GIT binary patch literal 415700 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