{"id":19483569,"url":"https://github.com/librity/ft_netmon","last_synced_at":"2026-02-28T03:08:28.615Z","repository":{"id":53091789,"uuid":"521255105","full_name":"librity/ft_netmon","owner":"librity","description":"42 São Paulo - Labs, 3rd Edition - netmon - A Threaded Network Monitoring Service in Pure C","archived":false,"fork":false,"pushed_at":"2022-09-09T04:10:24.000Z","size":58594,"stargazers_count":5,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2023-03-03T03:12:41.086Z","etag":null,"topics":["42","42born2code","42projects","42saopaulo","42school","c","dns","http","http-client","https","https-client","monitoring-tool","network-monitoring","norminette","ping","pthreads","threadpool","threads"],"latest_commit_sha":null,"homepage":"https://www.42sp.org.br/","language":"C","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/librity.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2022-08-04T12:19:46.000Z","updated_at":"2023-01-28T04:54:31.000Z","dependencies_parsed_at":"2023-01-18T01:45:40.775Z","dependency_job_id":null,"html_url":"https://github.com/librity/ft_netmon","commit_stats":null,"previous_names":[],"tags_count":null,"template":null,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/librity%2Fft_netmon","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/librity%2Fft_netmon/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/librity%2Fft_netmon/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/librity%2Fft_netmon/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/librity","download_url":"https://codeload.github.com/librity/ft_netmon/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":224007861,"owners_count":17240294,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["42","42born2code","42projects","42saopaulo","42school","c","dns","http","http-client","https","https-client","monitoring-tool","network-monitoring","norminette","ping","pthreads","threadpool","threads"],"created_at":"2024-11-10T20:15:35.217Z","updated_at":"2026-02-28T03:08:23.584Z","avatar_url":"https://github.com/librity.png","language":"C","readme":"\u003ch3 align=\"center\"\u003e42 São Paulo - Labs, 3rd Edition\u003c/h3\u003e\n\n\u003cdiv align=\"center\"\u003e\n\n![42 São Paulo](https://img.shields.io/badge/42-SP-1E2952)\n![License](https://img.shields.io/github/license/librity/ft_netmon?color=yellow)\n![Code size in bytes](https://img.shields.io/github/languages/code-size/librity/ft_netmon?color=blue)\n![Lines of code](https://img.shields.io/tokei/lines/github/librity/ft_netmon?color=blueviolet)\n![Top language](https://img.shields.io/github/languages/top/librity/ft_netmon?color=ff69b4)\n![Last commit](https://img.shields.io/github/last-commit/librity/ft_netmon?color=orange)\n\n\u003c/div\u003e\n\n\u003cdiv align=\"center\"\u003e\n\n[![Build](https://github.com/librity/ft_netmon/actions/workflows/build.yml/badge.svg)](https://github.com/librity/ft_netmon/actions/workflows/build.yml)\n[![Norminette v3](https://github.com/librity/ft_netmon/actions/workflows/norminette_v3.yml/badge.svg)](https://github.com/librity/ft_netmon/actions/workflows/norminette_v3.yml)\n\n\u003c/div\u003e\n\n\u003cp align=\"center\"\u003e A network monitoring service with \u003ccode\u003epthreads\u003c/code\u003e in pure C.\n  \u003cbr\u003e\n\u003c/p\u003e\n\n---\n\n```elixir\n/-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\\\n|                                                                                     |\n|                                              ::^~^:::     ::                        |\n|                                   :^~~JPGPJ5GB#\u0026\u0026\u0026\u0026\u0026#GYJ?!: :    :                  |\n|                              ::!YB#\u0026\u0026@@@@@@@@@@@@@@@@@@@@@#GPY7~^:  :               |\n|                         ^!?YP#\u0026@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\u0026B5!:               |\n|                     :!Y#\u0026@\u0026\u0026@@@@@@@@@@@@@\u0026\u0026\u0026##BBBBGBBB\u0026\u0026\u0026\u0026@@@@@@@@@\u00265?~:            |\n|                :!JYB\u0026@@@@@@@@@@@@@@@\u0026\u0026#??77^~^  :     :::^~!JP5G\u0026@@@\u0026#B?^           |\n|            ^?P#\u0026@@@@@@@@@@@@@@@\u0026\u0026BYPGJPY?PP?!?Y~!^^^:::::       :!?P#@@\u0026BY^         |\n|          Y#\u0026@@@@@@@@@@@@@@@\u0026#BGBPBG##P\u0026##\u0026##5B\u0026GB5?YY?5!7~~:^:::     ~5B\u0026\u0026P~:       |\n|        !\u0026@@@@@@@@@@@@@@\u0026\u0026#\u0026B\u0026\u0026#\u0026@@@\u0026@\u0026@\u0026@\u0026@@@\u0026\u0026\u0026\u0026#\u0026\u0026#B#GYY5??~~~^~  :   ~?#\u0026P^      |\n|        Y@@@@@@@@@@@\u0026\u0026G\u0026B#\u0026\u0026@\u0026GPYJ7!!!7!!7?Y5PGB#\u0026\u0026\u0026\u0026\u0026\u0026\u0026\u0026#\u0026B#BP557!~^!!:    ?\u0026#?     |\n|       :^?B##\u0026\u0026#BB5GBB#@@\u0026#5YY~^:  :~J: :~   :!~::~7JPB\u0026@\u0026@\u0026\u0026\u0026\u0026GBPPPY?J!!^:  :YB~    |\n|      :~~!?JJJY555P#\u0026@@\u0026BGGY5J?^^~?5\u0026@\u0026B#\u0026\u0026PPB\u0026\u0026J^7?: :^^~JG#\u0026\u0026\u0026###P#PG5J???^:  ~7   |\n|    ^^!J7555BBG\u0026\u0026\u0026@@@#5PBBY?75B\u0026@@@@@@@@@@@@@@@\u0026\u0026@#5GP~    :~?G#@#\u0026GGPGP5G57~::      |\n|    ^~7GJPP#B\u0026B\u0026\u0026@\u0026\u0026BPGP5J!P\u0026@@\u0026#@@@\u0026@@@@@@@@@@@@@\u0026@@\u0026BJ!~!~   :!5#BGP5GPPP~~:       |\n|    !??PGBG\u0026G#5\u0026@@#\u0026##B5!P@@\u0026#P!P@@@@@@@@@@@@\u0026\u0026\u0026@@BGB#\u0026@@@\u0026Y!~!^  :!55?YJ7~:         |\n|   !??PBG5GG#\u0026\u0026@#7!5G55J#@\u0026B?!^ ?@@@@#G@@@@@\u0026\u0026\u0026@@@!::~!5P#\u0026@@\u0026PPY~                   |\n|   :~?J5G#G#\u0026\u00265!   :JPB#@\u002657:   :B@@@B5@@@@\u0026\u0026\u0026\u0026@@5:      :75BBPY!                    |\n|    :!7YPBG#G:    ?@\u0026J^:P5~      :P\u0026@@@@@\u0026@@@@@#?           ^~!J~     :~!^!::        |\n|     :^?J5YJY:    :!?7YJ?7^:       ^YB\u0026\u0026@@@\u0026#P7      ::~!!?JJ!:   :^!J?Y?7!::        |\n|       : ::    :^^^:P#\u0026##5BPP??|^:    :^~~~^   ^^~~77JJ5J7^     ^75PJ5YY~^^          |\n|           :^!7BB\u0026#G\u0026BB\u0026G#PGJYGGGP555P5JYYY555GPJ?!!~:    ::^J55PBGP??|^:            |\n|                 :^7~PJBBG#\u0026@\u0026\u0026@B\u0026GJGJP?^~~~7~!7!~^:^7: ::^~~!~?GPB#5P5P?~           |\n|            :^^~J7YYBG#B#\u0026B\u0026\u0026\u0026\u0026##\u0026#BB5JY?5J?~7!^?5BGG\u0026BB#G\u0026#GJJ!^^:                  |\n|               :^!7!JY5YBYG5GBG\u0026G#\u0026#\u0026##\u0026#B\u0026B#BGG###BGBP5YY^^:                        |\n|                      ^ ~:!^77?YJYPJ5G5P55YGP?57PPJJ7?~^^::                          |\n|                            : :^:::: ^~:!^^^ :                                       |\n|                                                                                     |\n|-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-|\n|                                                                                     |\n!               ░░░    ░░ ░░░░░░░ ░░░░░░░░ ░░░    ░░░  ░░░░░░  ░░░    ░░              !\n!               ▒▒▒▒   ▒▒ ▒▒         ▒▒    ▒▒▒▒  ▒▒▒▒ ▒▒    ▒▒ ▒▒▒▒   ▒▒              !\n:               ▒▒ ▒▒  ▒▒ ▒▒▒▒▒      ▒▒    ▒▒ ▒▒▒▒ ▒▒ ▒▒    ▒▒ ▒▒ ▒▒  ▒▒              :\n:               ▓▓  ▓▓ ▓▓ ▓▓         ▓▓    ▓▓  ▓▓  ▓▓ ▓▓    ▓▓ ▓▓  ▓▓ ▓▓              :\n.               ██   ████ ███████    ██    ██      ██  ██████  ██   ████              .\n.                                                            by lpaulo-m              .\n.                                                                                     .\n.                          __ __     ___ __  __     __                                :\n:                         /  /  \\|\\ | | |__)/  \\|  (_                                 :\n:                         \\__\\__/| \\| | | \\ \\__/|____)                                :\n!                                                                                     !\n!                         - CONTROL+Q: Exits program cleanly.                         !\n!                         - CONTROL+C: Exits program.                                 !\n|                                                                                     |\n\\-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-/\n```\n\n## 📜 Table of Contents\n\n- [About](#about)\n- [Getting Started](#getting_started)\n- [Checklist](#checklist)\n- [42 São Paulo](#ft_sp)\n- [Resources](#resources)\n\n## 🧐 About \u003ca name = \"about\"\u003e\u003c/a\u003e\n\n\u003c!-- - [Specs (English)](./.github/specs_en.md) --\u003e\n\n- [Specs (Portuguese)](./.github/specs_pt.md)\n\nThis is a network monitor that periodically sends request\nand saves the results to a `.log` file.\nIt currently handles `HTTP`, `HTTPS`, `PING` and `DNS` requests.\n\nIt can be configured im multiple ways with the `netmon.db` file.\nEach line in the file specifies a target, protocol,\nand request frequency (period between requests).\nColumns are tab-separated and must conform to the format:\n\n```elixir\n====================================================================================================\n| PROTOCOL | ROWS (tab separated)                                                                  |\n====================================================================================================\n| HTTP     | name    HTTP     address    http_method    expected_http_code    frequency_in_seconds |\n| HTTPS    | name    HTTPS    address    http_method    expected_http_code    frequency_in_seconds |\n| PING     | name    PING     address    frequency_in_seconds                                      |\n| DNS      | name    DNS      address    frequency_in_seconds        dns_server_ipv4               |\n====================================================================================================\n```\n\nThe program parses the file and spawns a scheduler thread for each target\nthat periodically enqueues a new request in the request pool.\nIt also spawns worker threads that dequeue and perform the requests.\n\nThe worker then prints a simplified result of the request to `STDOUT`\nand saves all the relevant data to the specified `.log` file.\n\n![Usage Gif](./.github/usage_small.gif)\n\nIt can also parse the log file and print it to `STDOUT`\nin simple form with the flag `--simplify`.\n\nThe thread pool implementation is based on CodeVault's video:\n\n- https://www.youtube.com/watch?v=_n2hE2gyPxU\u0026list=PLfqABt5AS4FmuQf70psXrsMLEDQXNkLq2\u0026index=28\n\nI handled `HTTPS` request with `libcurl`,\nand made my own implementation of `HTTP`, `PING` and `DNS` based on:\n\n- https://www.youtube.com/watch?v=bdIiTxtMaKA\u0026list=PL9IEJIKnBJjH_zM5LnovnoaKlXML5qh17\u0026index=2\n- https://www.geeksforgeeks.org/ping-in-c/\n- https://www.theinsanetechie.in/2016/02/dns-lookup-implementation-in-c.html\n\nThis program uses Raw Sockets for the `PING` implementation\nand must be executed with root privileges\n(or any other user with `CAP_NET_ADMIN` capability).\n\n## 🏁 Getting Started \u003ca name = \"getting_started\"\u003e\u003c/a\u003e\n\n### ⚙️ Prerequisites\n\nTo compile and run this program you will need:\n\n- A shell and a C compiler (`gcc` ideally).\n- `GNU Make` installed in your computer.\n\nYou will also need to install `libcurl` as a dev dependency.\nYou can get it through apt-get (recommended):\n\n```bash\n$ sudo apt-get install libcurl4-openssl-dev\n```\n\nOr you can install it manually:\n\n```bash\n$ wget https://curl.se/download/curl-7.84.0.zip\n$ unzip curl-7.84.0.zip\n$ cd curl-7.84.0\n$ ./configure --with-openssl --prefix=$HOME/.local\n$ make\n$ make install\n```\n\n### 🖥️ Installing\n\nClone the repo and build with `make`:\n\n```bash\n$ git clone --recurse-submodules https://github.com/42sp/ft_netmon.git ft_netmon\n$ cd ft_netmon\n$ make\n```\n\nIt should create a `netmon` executable that you can run with `sudo ./netmon`.\n\n### 🏳️ Options and Flags\n\n- `-h` and `--help`: Print the help message.\n- `-s` and `--simplify`: Parse the `.log` file and print it to `STDOUT` in simple form.\n- `-d` and `--debug`: Verbose, prints debug throughout runtime.\n- `--config-file \u003cfile\u003e`: Specify the config file path (default `./netmon.db`).\n- `--log-file \u003cfile\u003e`: Specify the log file path (default `./netmon.log`).\n- `--workers \u003cnumber\u003e`: Set the initial number of worker threads (default `8`).\n\n## ✅ Checklist \u003ca name = \"checklist\"\u003e\u003c/a\u003e\n\n### Mandatory\n\n- [x] Follows `norminette 3.3.51`\n- [x] Makefile rules: `$(NAME)` `all` `clean` `fclean` `re`\n- [x] Compile an executable named `netmon`.\n- [x] Compiles with `-Wall -Wextra -Werror`\n- [x] Should not quit unexpectedly (segmentation fault, bus error, double free, etc.)\n- [x] All allocated heap memory properly freed, no memory leaks.\n  - [x] Check memory leaks with `valgrind`\n- [x] Allowed functions:\n  - [x] Anything you want, as long as you can reasonably justify it.\n- [x] Handle flags\n  - [x] `-h` and `—help` display help message and exits cleanly.\n  - [x] `-s` and `—simplify` reads the log file, prints it in simple form to `STDOUT` and exits cleanly.\n  - [x] `-d` and `—debug` flags that print debug info through runtime.\n  - [x] `—config-file \u003cfile\u003e` Set the config file path (default `./netmon.db`)\n  - [x] `--log-file \u003cfile\u003e` Set the log file path (default `./netmon.log`)\n  - [x] `--workers \u003cnumber\u003e` Set the initial number of worker threads (default `8`).\n- [x] Validate config file `netmon.db`:\n  - [x] Handle comments with `#`.\n  - [x] Validate `HTTP` configs:\n    - [x] Should have 6 tab-separated fields\n    - [x] Validate `HTTP_METHOD`.\n    - [x] Validate expected `HTTP_CODE`.\n    - [x] Validate timeout in seconds (`unsigned int` \u003e 0).\n  - [x] Validate `PING` configs:\n    - [x] Should have 4 tab-separated fields\n    - [x] Validate timeout in seconds (`unsigned int` \u003e 0).\n  - [x] Validate `DNS` configs:\n    - [x] Should have 5 tab-separated fields\n    - [x] Validate timeout in seconds (`unsigned int` \u003e 0).\n    - [x] Validate IPv4 address\n- [x] Parse configs for each protocol:\n  - [x] Parse `HTTP` targets\n  - [x] Parse `PING` targets\n  - [x] Parse `DNS` targets\n- [x] Each monitoring service/request must use the configurations defined in `netmon.db`.\n- [x] Handle request with a Thread Pool\n  - [x] Spawn workers that:\n    - [x] Dequeue task safely (`mutex` and `cond`)\n    - [x] Perform network requests\n    - [x] Display the simplified result to `STDOUT`.\n    - [x] Save all relevant request data to log file in parsable form.\n  - [x] Spawn a scheduler for every target in config file:\n    - [x] Enqueue target request safely (`mutex` and `cond`)\n    - [x] Enqueue every `timeout` seconds.\n  - [x] All threads exit cleanly and join main thread on `CONTROL+Q` with no deadlocks.\n    - [x] Enable tty raw mode and manually handle key presses.\n- [x] Requests:\n  - [x] `HTTP`\n    - [x] Get IP with **`getaddrinfo()`**\n    - [x] My own implementation with `sys/socket.h`\n    - [x] Save all relevant request data to log file in parsable form.\n  - [x] `HTTPS`\n    - [x] Use `libcurl` for the entire thing\n    - [x] Save all relevant request data to log file in parsable form.\n  - [x] `PING`\n    - [x] Get IP with **`getaddrinfo()`**\n    - [x] My own implementation with `sys/socket.h`\n    - [x] Save all relevant request data to log file in parsable form.\n  - [x] `DNS`\n    - [x] My own implementation with `sys/socket.h`\n    - [x] Save all relevant request data to log file in parsable form.\n- [x] `netmon.log` should contain all available request data.\n- [x] `netmon.log` should be saved in parsable form, such that it can be displayed simply with the `--simplify` flag.\n- [x] Should work as an useful and professional network monitoring service.\n- [x] Clean and readable code.\n- [x] Add a beautiful `README.md` explaining how the program works.\n- [x] Come up with simple and creative solutions.\n- [x] Follow specs as much as possible.\n\n### Bonus\n\n- [x] Parse add extra flags\n  - [x] Add help message.\n  - [x] Set custom config path.\n  - [x] Set custom log path.\n- [x] Take special care with optimizations, code quality and design patterns.\n- [x] Use external tools to plan and track various stages of development.\n- [ ] Notify bad request through Discord, email, Slack or Webhook.\n- [ ] Thoroughly test the application:\n  - [ ] Flag tests\n  - [ ] Config tests\n  - [ ] Thread Pool tests\n  - [ ] Request handler tests\n  - [ ] Logger tests\n- [ ] Identifies odd behaviors in target services, like and increase in latency.\n- [ ] Aggregate analysis of `netmon.log` data, with diagrams and graphs on the CLI.\n- [ ] Handle `MQTT` and `TCP` requests/monitoring:\n  - [ ] `TCP`\n    - [ ] My own implementation with `sys/socket.h`\n    - [ ] Save all relevant request data to log file in parsable form.\n  - [ ] `MQTT`\n    - [ ] Use `libcurl` for the entire thing\n    - [ ] Save all relevant request data to log file in parsable form.\n- [ ] Supervisor threads:\n  - [ ] Restart worker and scheduler threads that exit with an error.\n\n## 🛸 42 São Paulo \u003ca name = \"ft_sp\"\u003e\u003c/a\u003e\n\nPart of the larger [42 Network](https://www.42.fr/42-network/),\n[42 São Paulo](https://www.42sp.org.br/) is a software engineering school\nthat offers a healthy alternative to traditional education:\n\n- It doesn't have any teachers and classes.\n- Students learn by cooperating\n  and correcting each other's work (peer-to-peer learning).\n- Its focus is as much on social skills as it is on technical skills.\n- It's completely free to anyone that passes its selection process -\n  [**The Piscine**](https://42.fr/en/admissions/42-piscine/)\n\nIt's an amazing school, and I'm grateful for the opportunity.\n\n## 📚 Resources \u003ca name = \"resources\"\u003e\u003c/a\u003e\n\n### `HTTP` and `HTTPS`\n\n- [https://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol](https://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol)\n- [https://developer.mozilla.org/en-US/docs/Web/HTTP/Status](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status)\n- [https://en.wikipedia.org/wiki/List_of_HTTP_status_codes](https://en.wikipedia.org/wiki/List_of_HTTP_status_codes)\n- [https://stackoverflow.com/questions/5133968/using-libcurl-to-monitor-state-of-a-network](https://stackoverflow.com/questions/5133968/using-libcurl-to-monitor-state-of-a-network)\n\n### `HTTP` Methods\n\n- [https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods)\n- [https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/POST#example](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/POST#example)\n- [https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/GET#syntax](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/GET#syntax)\n\n### `HTTP` Headers\n\n- [https://stackoverflow.com/questions/69998964/http-headers-as-string-which-delimiter-to-use/70005319](https://stackoverflow.com/questions/69998964/http-headers-as-string-which-delimiter-to-use/70005319)\n- [https://datatracker.ietf.org/doc/html/rfc7230#section-3](https://datatracker.ietf.org/doc/html/rfc7230#section-3)\n- [https://medium.com/swlh/looking-under-the-hood-http-over-tcp-sockets-952a944c99da](https://medium.com/swlh/looking-under-the-hood-http-over-tcp-sockets-952a944c99da)\n\n### `HTTP` Implementations\n\n- [https://stackoverflow.com/questions/30470505/http-request-using-sockets-in-c](https://stackoverflow.com/questions/30470505/http-request-using-sockets-in-c)\n- [https://www.youtube.com/watch?v=bdIiTxtMaKA\u0026list=PL9IEJIKnBJjH_zM5LnovnoaKlXML5qh17\u0026index=2](https://www.youtube.com/watch?v=bdIiTxtMaKA\u0026list=PL9IEJIKnBJjH_zM5LnovnoaKlXML5qh17\u0026index=2)\n- [https://stackoverflow.com/questions/30470505/http-request-using-sockets-in-c](https://stackoverflow.com/questions/30470505/http-request-using-sockets-in-c)\n\n### `PING`\n\n- [https://en.wikipedia.org/wiki/Ping\\_(networking_utility)](\u003chttps://en.wikipedia.org/wiki/Ping_(networking_utility)\u003e)\n- [https://www.geeksforgeeks.org/internet-control-message-protocol-icmp/](https://www.geeksforgeeks.org/internet-control-message-protocol-icmp/)\n- [https://www.opensourceforu.com/2015/03/a-guide-to-using-raw-sockets/](https://www.opensourceforu.com/2015/03/a-guide-to-using-raw-sockets/)\n- [https://www.geeksforgeeks.org/error-detection-in-computer-networks/](https://www.geeksforgeeks.org/error-detection-in-computer-networks/)\n- [https://www.geeksforgeeks.org/domain-name-system-dns-in-application-layer/](https://www.geeksforgeeks.org/domain-name-system-dns-in-application-layer/)\n- [https://en.wikipedia.org/wiki/Internet_Control_Message_Protocol](https://en.wikipedia.org/wiki/Internet_Control_Message_Protocol)\n- [https://curl.se/mail/lib-2012-11/0103.html](https://curl.se/mail/lib-2012-11/0103.html)\n\n### `PING` Implementations\n\n- [https://www.geeksforgeeks.org/ping-in-c/](https://www.geeksforgeeks.org/ping-in-c/)\n- [https://github.com/sryze/ping/blob/master/src/ping.c](https://github.com/sryze/ping/blob/master/src/ping.c)\n- [https://stackoverflow.com/questions/9688899/sending-icmp-packets-in-a-c-program](https://stackoverflow.com/questions/9688899/sending-icmp-packets-in-a-c-program)\n- [https://www.mycplus.com/source-code/c-source-code/ping/](https://www.mycplus.com/source-code/c-source-code/ping/)\n- [https://github.com/a-khakimov/ping](https://github.com/a-khakimov/ping)\n- [https://github.com/sryze/ping](https://github.com/sryze/ping)\n\n### `DNS`\n\n- [https://en.wikipedia.org/wiki/Domain_Name_System](https://en.wikipedia.org/wiki/Domain_Name_System)\n- [https://stackoverflow.com/questions/1128409/how-might-i-perform-dns-lookups-using-c-c-on-linux](https://stackoverflow.com/questions/1128409/how-might-i-perform-dns-lookups-using-c-c-on-linux)\n\n### `DNS` Implementations\n\n- [https://gist.github.com/deltheil/6183330](https://gist.github.com/deltheil/6183330)\n- [https://programmersought.com/article/85444274234/](https://programmersought.com/article/85444274234/)\n- [https://www.binarytides.com/dns-query-code-in-c-with-linux-sockets/](https://www.binarytides.com/dns-query-code-in-c-with-linux-sockets/)\n- [https://www.theinsanetechie.in/2016/02/dns-lookup-implementation-in-c.html](https://www.theinsanetechie.in/2016/02/dns-lookup-implementation-in-c.html)\n- [https://gist.github.com/fffaraz/9d9170b57791c28ccda9255b48315168](https://gist.github.com/fffaraz/9d9170b57791c28ccda9255b48315168)\n\n### `DNS` Libs\n\n- [https://man7.org/linux/man-pages/man3/gethostbyname.3.html](https://man7.org/linux/man-pages/man3/gethostbyname.3.html)\n- [https://linux.die.net/man/3/res_query](https://linux.die.net/man/3/res_query)\n- [https://github.com/rofl0r/firedns](https://github.com/rofl0r/firedns)\n\n### `MQTT`\n\n- [https://mqtt.org/](https://mqtt.org/)\n- [https://en.wikipedia.org/wiki/MQTT](https://en.wikipedia.org/wiki/MQTT)\n- [https://mongoose.ws/documentation/#mg_mqtt_ping](https://mongoose.ws/documentation/#mg_mqtt_ping)\n- [http://www.steves-internet-guide.com/mqtt/](http://www.steves-internet-guide.com/mqtt/)\n\n### `TCP`\n\n- [https://stackoverflow.com/questions/57950145/is-it-possible-to-use-libcurl-to-manage-raw-tcp-connections](https://stackoverflow.com/questions/57950145/is-it-possible-to-use-libcurl-to-manage-raw-tcp-connections)\n- [https://curl.se/libcurl/c/sendrecv.html](https://curl.se/libcurl/c/sendrecv.html)\n\n### **[`getaddrinfo](https://gist.github.com/jirihnidek/bf7a2363e480491da72301b228b35d5d#file-getaddrinfo_example-c)()`**\n\n- [https://en.wikipedia.org/wiki/Getaddrinfo](https://en.wikipedia.org/wiki/Getaddrinfo)\n- [https://man7.org/linux/man-pages/man3/getaddrinfo.3.html](https://man7.org/linux/man-pages/man3/getaddrinfo.3.html)\n- [https://gist.github.com/jirihnidek/bf7a2363e480491da72301b228b35d5d](https://gist.github.com/jirihnidek/bf7a2363e480491da72301b228b35d5d)\n- [http://alas.matf.bg.ac.rs/manuals/lspe/snode=77.html](http://alas.matf.bg.ac.rs/manuals/lspe/snode=77.html)\n- [https://stackoverflow.com/questions/755308/whats-the-hints-mean-for-the-addrinfo-name-in-socket-programming](https://stackoverflow.com/questions/755308/whats-the-hints-mean-for-the-addrinfo-name-in-socket-programming)\n\n### `arpa/inet.h`\n\n- [https://stackoverflow.com/questions/318236/how-do-you-validate-that-a-string-is-a-valid-ipv4-address-in-c](https://stackoverflow.com/questions/318236/how-do-you-validate-that-a-string-is-a-valid-ipv4-address-in-c)\n- [https://man7.org/linux/man-pages/man3/inet_pton.3.html](https://man7.org/linux/man-pages/man3/inet_pton.3.html)\n- [https://linux.die.net/man/3/inet_addr](https://linux.die.net/man/3/inet_addr)\n\n### `sockaddr_in`\n\n- [https://programmersought.com/article/76814417359/](https://programmersought.com/article/76814417359/)\n- [https://stackoverflow.com/questions/23146286/how-to-initialize-sockaddr-in-using-addrinfo](https://stackoverflow.com/questions/23146286/how-to-initialize-sockaddr-in-using-addrinfo)\n- [https://pubs.opengroup.org/onlinepubs/009695399/functions/inet_pton.html](https://pubs.opengroup.org/onlinepubs/009695399/functions/inet_pton.html)\n- [https://stackoverflow.com/questions/1705885/why-inet-ntoa-is-designed-to-be-a-non-reentrant-function](https://stackoverflow.com/questions/1705885/why-inet-ntoa-is-designed-to-be-a-non-reentrant-function)\n\n### `sys/socket.h`\n\n- [https://man7.org/linux/man-pages/man2/connect.2.html](https://man7.org/linux/man-pages/man2/connect.2.html)\n- [https://man7.org/linux/man-pages/man7/tcp.7.html](https://man7.org/linux/man-pages/man7/tcp.7.html)\n- [https://linux.die.net/man/7/socket](https://linux.die.net/man/7/socket)\n- [https://man7.org/linux/man-pages/man7/socket.7.html](https://man7.org/linux/man-pages/man7/socket.7.html)\n\n### Time to Live\n\n- [https://en.wikipedia.org/wiki/Time_to_live](https://en.wikipedia.org/wiki/Time_to_live)\n\n### **`CAP_NET_ADMIN` and** `SOCK_RAW`\n\n- [https://man7.org/linux/man-pages/man7/capabilities.7.html](https://man7.org/linux/man-pages/man7/capabilities.7.html)\n- [https://stackoverflow.com/questions/30780082/sock-raw-option-in-socket-system-call](https://stackoverflow.com/questions/30780082/sock-raw-option-in-socket-system-call)\n- [https://linux.die.net/man/7/raw](https://linux.die.net/man/7/raw)\n- [https://www.tenouk.com/Module43a.html](https://www.tenouk.com/Module43a.html)\n- [https://austinmarton.wordpress.com/2011/09/14/sending-raw-ethernet-packets-from-a-specific-interface-in-c-on-linux/](https://austinmarton.wordpress.com/2011/09/14/sending-raw-ethernet-packets-from-a-specific-interface-in-c-on-linux/)\n\n### `sys/capability.h`\n\n- [https://man7.org/linux/man-pages/man3/libcap.3.html](https://man7.org/linux/man-pages/man3/libcap.3.html)\n- [https://man7.org/linux/man-pages/man3/cap_from_text.3.html](https://man7.org/linux/man-pages/man3/cap_from_text.3.html)\n- [https://stackoverflow.com/questions/8338379/ubuntu-and-libcap-capabilities-undefined-reference](https://stackoverflow.com/questions/8338379/ubuntu-and-libcap-capabilities-undefined-reference)\n- [https://gist.github.com/sbz/1090868](https://gist.github.com/sbz/1090868)\n- [http://unixetc.co.uk/2016/05/30/linux-capabilities-and-ping/](http://unixetc.co.uk/2016/05/30/linux-capabilities-and-ping/)\n\n### `setsockopt()`\n\n- [https://stackoverflow.com/questions/2876024/linux-is-there-a-read-or-recv-from-socket-with-timeout](https://stackoverflow.com/questions/2876024/linux-is-there-a-read-or-recv-from-socket-with-timeout)\n- [https://linux.die.net/man/3/setsockopt](https://linux.die.net/man/3/setsockopt)\n\n### `pthread.h`\n\n- [https://en.wikipedia.org/wiki/Pthreads](https://en.wikipedia.org/wiki/Pthreads)\n- [https://www.geeksforgeeks.org/thread-functions-in-c-c/](https://www.geeksforgeeks.org/thread-functions-in-c-c/)\n- https://www.man7.org/linux/man-pages/man0/pthread.h.0p.html\n- https://iq.opengenus.org/multithreading-and-pthread-in-c/\n- https://www.geeksforgeeks.org/multithreading-c-2/\n- https://www.tutorialspoint.com/multithreading-in-c\n- https://github.com/samuelpio01/multithreading-in-c/blob/master/pthread_multithreading.c\n- [https://www.youtube.com/playlist?list=PLfqABt5AS4FmuQf70psXrsMLEDQXNkLq2](https://www.youtube.com/playlist?list=PLfqABt5AS4FmuQf70psXrsMLEDQXNkLq2)\n- [https://www.youtube.com/watch?v=9axu8CUvOKY](https://www.youtube.com/watch?v=9axu8CUvOKY)\n\n### `pthread_create`\n\n- [https://man7.org/linux/man-pages/man3/pthread_create.3.htmlhttps://man7.org/linux/man-pages/man3/pthread_create.3.html](https://man7.org/linux/man-pages/man3/pthread_create.3.html)\n- [http://www.cse.cuhk.edu.hk/~ericlo/teaching/os/lab/9-PThread/Pass.html](http://www.cse.cuhk.edu.hk/~ericlo/teaching/os/lab/9-PThread/Pass.html)\n- [https://stackoverflow.com/questions/39117674/how-to-pass-arguments-when-using-pthread-create](https://stackoverflow.com/questions/39117674/how-to-pass-arguments-when-using-pthread-create)\n\n### **`pthread_detach**()`\n\n- [https://man7.org/linux/man-pages/man3/pthread_detach.3.html](https://man7.org/linux/man-pages/man3/pthread_detach.3.html)\n\n### `pthread_mutex_t`\n\n- [https://linux.die.net/man/3/pthread_mutex_init](https://linux.die.net/man/3/pthread_mutex_init)\n- [https://stackoverflow.com/questions/20487752/how-to-handle-error-conditions-of-pthread-mutex-destroy](https://stackoverflow.com/questions/20487752/how-to-handle-error-conditions-of-pthread-mutex-destroy)\n\n### **`pthread_cond_t`**\n\n- [https://linux.die.net/man/3/pthread_cond_init](https://linux.die.net/man/3/pthread_cond_init)\n- [https://manpages.org/pthread_cond_timedwait/3](https://manpages.org/pthread_cond_timedwait/3)\n- [https://linux.die.net/man/3/pthread_cond_init](https://linux.die.net/man/3/pthread_cond_init)\n- [https://stackoverflow.com/questions/11000331/how-does-pthread-cond-broadcast-works](https://stackoverflow.com/questions/11000331/how-does-pthread-cond-broadcast-works)\n- [https://linux.die.net/man/3/pthread_cond_broadcast](https://linux.die.net/man/3/pthread_cond_broadcast)\n- [https://linux.die.net/man/3/pthread_mutex_destroy](https://linux.die.net/man/3/pthread_mutex_destroy)\n- [https://docs.oracle.com/cd/E19455-01/806-5257/6je9h032r/index.html](https://docs.oracle.com/cd/E19455-01/806-5257/6je9h032r/index.html)\n\n### `pthread_exit()`\n\n- [https://www.thegeekstuff.com/2012/04/terminate-c-thread/](https://www.thegeekstuff.com/2012/04/terminate-c-thread/)\n- [https://stackoverflow.com/questions/12207684/how-do-i-terminate-a-thread-in-c11](https://stackoverflow.com/questions/12207684/how-do-i-terminate-a-thread-in-c11)\n- [https://stackoverflow.com/questions/16320838/when-do-i-really-need-to-use-atomicbool-instead-of-bool](https://stackoverflow.com/questions/16320838/when-do-i-really-need-to-use-atomicbool-instead-of-bool)\n\n### **`pthread_cancel**()`\n\n- [https://man7.org/linux/man-pages/man3/pthread_cancel.3.html](https://man7.org/linux/man-pages/man3/pthread_cancel.3.html)\n- [https://stackoverflow.com/questions/15641145/thread-cancel-and-blocking-function-as-cond-wait](https://stackoverflow.com/questions/15641145/thread-cancel-and-blocking-function-as-cond-wait)\n- [https://linux.die.net/man/3/pthread_cleanup_push](https://linux.die.net/man/3/pthread_cleanup_push)\n- [https://man7.org/linux/man-pages/man3/pthread_setcanceltype.3.html](https://man7.org/linux/man-pages/man3/pthread_setcanceltype.3.html)\n- [https://stackoverflow.com/questions/20304366/how-to-fix-gcc-error-expected-while-before-void](https://stackoverflow.com/questions/20304366/how-to-fix-gcc-error-expected-while-before-void)\n\n### _`pthread_key_create_()`\n\n- [https://linux.die.net/man/3/pthread_key_create](https://linux.die.net/man/3/pthread_key_create)\n\n### Request Scheduling Options\n\n- [ ] `while`/`sleep`\n- [ ] `timer_create`\n- [ ] Wild threads\n- [x] Thread Pool + Thread Schedulers + Thread Supervisor\n\n### Thread Pools\n\n- [https://en.wikipedia.org/wiki/Thread_pool](https://en.wikipedia.org/wiki/Thread_pool)\n- [https://github.com/ericomeehan/libeom/blob/main/Systems/ThreadPool.c](https://github.com/ericomeehan/libeom/blob/main/Systems/ThreadPool.c)\n- [https://github.com/Pithikos/C-Thread-Pool](https://github.com/Pithikos/C-Thread-Pool)\n- [https://nachtimwald.com/2019/04/12/thread-pool-in-c/](https://nachtimwald.com/2019/04/12/thread-pool-in-c/)\n- [https://stackoverflow.com/questions/15752659/thread-pooling-in-c11](https://stackoverflow.com/questions/15752659/thread-pooling-in-c11)\n- [https://www.youtube.com/watch?v=\\_n2hE2gyPxU\u0026list=PLfqABt5AS4FmuQf70psXrsMLEDQXNkLq2\u0026index=29](https://www.youtube.com/watch?v=_n2hE2gyPxU\u0026list=PLfqABt5AS4FmuQf70psXrsMLEDQXNkLq2\u0026index=29)\n- [https://www.youtube.com/watch?v=w6dQQt10Dxo](https://www.youtube.com/watch?v=w6dQQt10Dxo)\n- [https://www.youtube.com/watch?v=Pg_4Jz8ZIH4](https://www.youtube.com/watch?v=Pg_4Jz8ZIH4)\n- [https://www.youtube.com/watch?v=WmDOHh7k0Ag](https://www.youtube.com/watch?v=WmDOHh7k0Ag)\n- [https://www.youtube.com/watch?v=FMNnusHqjpw](https://www.youtube.com/watch?v=FMNnusHqjpw)\n- [https://www.geeksforgeeks.org/thread-functions-in-c-c/](https://www.geeksforgeeks.org/thread-functions-in-c-c/)\n\n### Thread-safe `time.h`\n\n- [https://stackoverflow.com/questions/7411301/how-to-introduce-date-and-time-in-log-file](https://stackoverflow.com/questions/7411301/how-to-introduce-date-and-time-in-log-file)\n- [https://linux.die.net/man/3/localtime_r](https://linux.die.net/man/3/localtime_r)\n- [https://en.cppreference.com/w/c/chrono/localtime](https://en.cppreference.com/w/c/chrono/localtime)\n- [https://linux.die.net/man/3/time](https://linux.die.net/man/3/time)\n- [https://stackoverflow.com/questions/17982366/localtime-and-asctime-are-unsafe-but-the-safe-functions-dont-have-the-same-par](https://stackoverflow.com/questions/17982366/localtime-and-asctime-are-unsafe-but-the-safe-functions-dont-have-the-same-par)\n- [https://stackoverflow.com/questions/42861913/why-use-usleep-and-not-sleep](https://stackoverflow.com/questions/42861913/why-use-usleep-and-not-sleep)\n- [https://man7.org/linux/man-pages/man3/clock.3.html](https://man7.org/linux/man-pages/man3/clock.3.html)\n\n### `time_t` vs. `clock_t`\n\n- [https://stackoverflow.com/questions/12240059/what-is-the-difference-between-clock-t-time-t-and-struct-tm](https://stackoverflow.com/questions/12240059/what-is-the-difference-between-clock-t-time-t-and-struct-tm)\n- [https://www.geeksforgeeks.org/how-to-measure-time-taken-by-a-program-in-c/](https://www.geeksforgeeks.org/how-to-measure-time-taken-by-a-program-in-c/)\n\n### `strftime`\n\n- [https://stackoverflow.com/questions/7411301/how-to-introduce-date-and-time-in-log-file](https://stackoverflow.com/questions/7411301/how-to-introduce-date-and-time-in-log-file)\n- [https://man7.org/linux/man-pages/man3/strftime.3.html](https://man7.org/linux/man-pages/man3/strftime.3.html)\n\n### Thread-safe `read()`, `write()` and `printf()`\n\n- [https://stackoverflow.com/questions/467938/stdout-thread-safe-in-c-on-linux](https://stackoverflow.com/questions/467938/stdout-thread-safe-in-c-on-linux)\n- [https://man7.org/linux/man-pages/man3/flockfile.3.html](https://man7.org/linux/man-pages/man3/flockfile.3.html)\n- [https://linux.die.net/man/3/fprintf](https://linux.die.net/man/3/fprintf)\n- [https://linux.die.net/man/3/asprintf](https://linux.die.net/man/3/asprintf)\n- [https://man7.org/linux/man-pages/man3/stdio.3.html](https://man7.org/linux/man-pages/man3/stdio.3.html)\n- [https://en.cppreference.com/w/c/io/fopen](https://en.cppreference.com/w/c/io/fopen)\n- [https://man7.org/linux/man-pages/man3/fclose.3.html](https://man7.org/linux/man-pages/man3/fclose.3.html)\n- [https://man7.org/linux/man-pages/man3/fopen.3.html](https://man7.org/linux/man-pages/man3/fopen.3.html)\n- [https://en.wikipedia.org/wiki/C_file_input/output](https://en.wikipedia.org/wiki/C_file_input/output)\n- [https://stackoverflow.com/questions/61911258/difference-between-file-pointer-stream-file-descriptor-and-file](https://stackoverflow.com/questions/61911258/difference-between-file-pointer-stream-file-descriptor-and-file)\n\n### `timer_create`\n\n- [https://stackoverflow.com/questions/8714016/calling-a-function-at-exact-every-second-using-a-timer](https://stackoverflow.com/questions/8714016/calling-a-function-at-exact-every-second-using-a-timer)\n- [https://linux.die.net/man/2/timer_create](https://linux.die.net/man/2/timer_create)\n\n### Wild threads\n\n- [https://stackoverflow.com/questions/13923885/execute-a-method-every-x-seconds-in-c](https://stackoverflow.com/questions/13923885/execute-a-method-every-x-seconds-in-c)\n\n### Thread Supervisor\n\n- [https://github.com/asherikov/thread_supervisor](https://github.com/asherikov/thread_supervisor)\n- [https://stackoverflow.com/questions/27594027/supervising-c-multithread-process-using-monit](https://stackoverflow.com/questions/27594027/supervising-c-multithread-process-using-monit)\n\n### `libcurl`\n\n- [https://curl.se/libcurl/](https://curl.se/libcurl/)\n- [https://github.com/curl/curl](https://github.com/curl/curl)\n- [https://curl.se/libcurl/c/getinmemory.html](https://curl.se/libcurl/c/getinmemory.html)\n- [https://www.youtube.com/watch?v=DVR8N9ob_ZY\u0026list=PLpXAyWkDQy40u-xT-Zr6Rab6EdEFOjO2W\u0026index=6](https://www.youtube.com/watch?v=DVR8N9ob_ZY\u0026list=PLpXAyWkDQy40u-xT-Zr6Rab6EdEFOjO2W\u0026index=6)\n- [https://www.youtube.com/watch?v=daA-KBKfJ_o](https://www.youtube.com/watch?v=daA-KBKfJ_o)\n- [https://hub.docker.com/r/curlimages/curl](https://hub.docker.com/r/curlimages/curl)\n- [https://stackoverflow.com/questions/57950145/is-it-possible-to-use-libcurl-to-manage-raw-tcp-connections](https://stackoverflow.com/questions/57950145/is-it-possible-to-use-libcurl-to-manage-raw-tcp-connections)\n- [https://stackoverflow.com/questions/16476196/undefined-reference-to-curl-global-init-curl-easy-init-and-other-functionc](https://stackoverflow.com/questions/16476196/undefined-reference-to-curl-global-init-curl-easy-init-and-other-functionc)\n- [https://curl.se/libcurl/c/CURLOPT_DNS_SERVERS.html](https://curl.se/libcurl/c/CURLOPT_DNS_SERVERS.html)\n\n```bash\n# LIBCURL WORKSPACE INSTALL\n$ wget https://curl.se/download/curl-7.84.0.zip\n$ unzip -d curl-7.84.0.zip\n$ ./configure --with-openssl --prefix=$HOME/.local\n$ make\n$ make install\n# Lib in ~/.local/lib\n# Includes in ~/.local/include\n$ curl-config --cflags\n$ curl-config --libs\n```\n\n- [x] `HTTP`\n- [x] `HTTPS`\n- [x] `MQTT`\n\n### `Mongoose`\n\n- [https://github.com/cesanta/mongoose](https://github.com/cesanta/mongoose)\n- [https://mongoose.ws/documentation/#minimal-tcp-echo-server](https://mongoose.ws/documentation/#minimal-tcp-echo-server)\n- [https://mongoose.ws/tutorials/http-client/](https://mongoose.ws/tutorials/http-client/)\n- [https://mongoose.ws/tutorials/mqtt-client/](https://mongoose.ws/tutorials/mqtt-client/)\n- [https://mongoose.ws/documentation/#user-guide](https://mongoose.ws/documentation/#user-guide)\n- [https://mongoose.ws/tutorials/http-server/#using-mg_printf](https://mongoose.ws/tutorials/http-server/#using-mg_printf)\n- [https://mongoose.ws/tutorials/](https://mongoose.ws/tutorials/)\n- [x] `HTTP`\n- [x] `HTTPS`\n- [x] `MQTT`\n\n### `Paho MQTT Client`\n\n- [https://github.com/eclipse/paho.mqtt.c](https://github.com/eclipse/paho.mqtt.c)\n- [x] `MQTT`\n- [ ] `HTTP`\n- [ ] `HTTPS`\n\n### `Mosquito`\n\n- [https://mosquitto.org/](https://mosquitto.org/)\n- [https://www.youtube.com/watch?v=ERPhUsmbhMo](https://www.youtube.com/watch?v=ERPhUsmbhMo)\n- [x] `MQTT`\n- [ ] `HTTP`\n- [ ] `HTTPS`\n\n### Doxygen style documentation\n\n- [https://www.doxygen.nl/](https://www.doxygen.nl/)\n- [https://stackoverflow.com/questions/8889942/how-to-write-documentation-comments-in-ansi-c](https://stackoverflow.com/questions/8889942/how-to-write-documentation-comments-in-ansi-c)\n- [https://github.com/vcwild/feminist-api/blob/main/sources/cli.c#L3](https://github.com/vcwild/feminist-api/blob/main/sources/cli.c#L3)\n\n### URLs\n\n- [https://www.geeksforgeeks.org/check-if-an-url-is-valid-or-not-using-regular-expression/](https://www.geeksforgeeks.org/check-if-an-url-is-valid-or-not-using-regular-expression/)\n- [https://en.wikipedia.org/wiki/URL](https://en.wikipedia.org/wiki/URL)\n- [https://developer.mozilla.org/en-US/docs/Learn/Common_questions/What_is_a_URL](https://developer.mozilla.org/en-US/docs/Learn/Common_questions/What_is_a_URL)\n\n### `lalloc` - Listed Memory Allocation\n\nA linked list in the control structure with all the allocated memory pointers.\nThe interface function `ft_lalloc` allocates memory and adds the pointer to the list.\nThe interface function `ft_free_lalloc` frees all pointers and the list.\n\n### `realloc`\n\n- [https://codereview.stackexchange.com/questions/151019/implementing-realloc-in-c](https://codereview.stackexchange.com/questions/151019/implementing-realloc-in-c)\n- [https://manpages.org/realloc](https://manpages.org/realloc)\n- [https://stackoverflow.com/questions/10864593/implementation-of-realloc-in-c](https://stackoverflow.com/questions/10864593/implementation-of-realloc-in-c)\n\n### Git `submodule`\n\n- `git clone --recurse-submodule REMOTE_REPO`\n- `git submodule add REMOTE_REPO PATH`\n- `git submodule foreach git pull`\n- `git submodule update --init --recursive`\n- [https://stackoverflow.com/questions/33714063/how-to-update-submodules-in-git](https://stackoverflow.com/questions/33714063/how-to-update-submodules-in-git)\n- [https://stackoverflow.com/questions/59271919/how-to-clone-public-submodule-in-github-actions](https://stackoverflow.com/questions/59271919/how-to-clone-public-submodule-in-github-actions)\n- [https://stackoverflow.com/questions/50254184/git-submodule-and-fetch](https://stackoverflow.com/questions/50254184/git-submodule-and-fetch)\n- [https://www.w3docs.com/snippets/git/how-to-add-a-submodule-in-git.html](https://www.w3docs.com/snippets/git/how-to-add-a-submodule-in-git.html)\n- [https://stackoverflow.com/questions/1260748/how-do-i-remove-a-submodule#1260982](https://stackoverflow.com/questions/1260748/how-do-i-remove-a-submodule#1260982)\n- [https://stackoverflow.com/questions/2006172/git-how-to-reset-a-remote-git-repository-to-remove-all-commits](https://stackoverflow.com/questions/2006172/git-how-to-reset-a-remote-git-repository-to-remove-all-commits)\n\n### Log Formats\n\n- [https://stackoverflow.com/questions/1765689/what-is-the-best-practice-for-formatting-logs](https://stackoverflow.com/questions/1765689/what-is-the-best-practice-for-formatting-logs)\n- [https://www.ibm.com/docs/en/i/7.1?topic=logging-log-formats](https://www.ibm.com/docs/en/i/7.1?topic=logging-log-formats)\n- [https://www.sentinelone.com/blog/log-formatting-best-practices-readable/](https://www.sentinelone.com/blog/log-formatting-best-practices-readable/)\n- [https://en.wikipedia.org/wiki/Syslog](https://en.wikipedia.org/wiki/Syslog)\n\n```bash\n$ bat /var/log/syslog\n```\n\n### Github Actions `libcurl`\n\n- [https://github.com/actions/virtual-environments/issues/5470](https://github.com/actions/virtual-environments/issues/5470)\n- [https://github.com/actions/virtual-environments/issues/3640](https://github.com/actions/virtual-environments/issues/3640)\n- [https://github.com/asozialesnetzwerk/an-website/blob/main/.github/workflows/check.yml](https://github.com/asozialesnetzwerk/an-website/blob/main/.github/workflows/check.yml)\n\n### `DNS` Servers\n\n- [https://www.lifewire.com/free-and-public-dns-servers-2626062](https://www.lifewire.com/free-and-public-dns-servers-2626062)\n- [https://developers.google.com/speed/public-dns/docs/using](https://developers.google.com/speed/public-dns/docs/using)\n\n### VSCode\n\n- [https://code.visualstudio.com/docs/editor/debugging](https://code.visualstudio.com/docs/editor/debugging)\n- [https://code.visualstudio.com/docs/editor/tasks](https://code.visualstudio.com/docs/editor/tasks)\n- [https://code.visualstudio.com/docs/cpp/c-cpp-properties-schema-reference](https://code.visualstudio.com/docs/cpp/c-cpp-properties-schema-reference)\n\n### C JSON Libs\n\n- [https://github.com/cesanta/mjson](https://github.com/cesanta/mjson)\n\n### `json-c`\n\n- [https://github.com/json-c/json-c](https://github.com/json-c/json-c)\n- [https://github.com/rbtylee/tutorial-jsonc/blob/master/tutorial/index.md](https://github.com/rbtylee/tutorial-jsonc/blob/master/tutorial/index.md)\n- [https://progur.com/2018/12/how-to-parse-json-in-c.html](https://progur.com/2018/12/how-to-parse-json-in-c.html)\n- [https://github.com/json-c/json-c/wiki/List-of-json-c-tutorials](https://github.com/json-c/json-c/wiki/List-of-json-c-tutorials)\n\n### Mock Server\n\n- [https://learning.postman.com/docs/designing-and-developing-your-api/mocking-data/setting-up-mock/](https://learning.postman.com/docs/designing-and-developing-your-api/mocking-data/setting-up-mock/)\n- [https://mock-server.com/mock_server/running_mock_server.html](https://mock-server.com/mock_server/running_mock_server.html)\n- [https://httptoolkit.tech/](https://httptoolkit.tech/)\n\n### Multi-threaded Web Server\n\n- [https://github.com/nhanhoangtran/3_multithreaded_webserver_using_condition_variables](https://github.com/nhanhoangtran/3_multithreaded_webserver_using_condition_variables)\n- [https://github.com/dolev146/JACOB-SORBER-multithreaded-server-all-parts/blob/master/part1/client.rb](https://github.com/dolev146/JACOB-SORBER-multithreaded-server-all-parts/blob/master/part1/client.rb)\n\n### C Quirks\n\n- [https://docs.microsoft.com/en-us/cpp/c-language/cpp-integer-limits?view=msvc-170](https://docs.microsoft.com/en-us/cpp/c-language/cpp-integer-limits?view=msvc-170)\n- [https://stackoverflow.com/questions/3053561/how-do-i-assign-an-alias-to-a-function-name-in-c](https://stackoverflow.com/questions/3053561/how-do-i-assign-an-alias-to-a-function-name-in-c)\n- [https://stackoverflow.com/questions/32698293/assign-values-to-structure-variables](https://stackoverflow.com/questions/32698293/assign-values-to-structure-variables)\n- [https://stackoverflow.com/questions/41304497/print-the-structure-fields-and-values-in-c](https://stackoverflow.com/questions/41304497/print-the-structure-fields-and-values-in-c)\n- [https://stackoverflow.com/questions/4949254/const-char-const-versus-const-char](https://stackoverflow.com/questions/4949254/const-char-const-versus-const-char)\n\n### C Libs\n\n- [https://stackoverflow.com/questions/668501/are-there-any-open-source-c-libraries-with-common-data-structures](https://stackoverflow.com/questions/668501/are-there-any-open-source-c-libraries-with-common-data-structures)\n- [https://github.com/nothings/single_file_libs](https://github.com/nothings/single_file_libs)\n- [https://github.com/oz123/awesome-c#concurrency-and-parallelism](https://github.com/oz123/awesome-c#concurrency-and-parallelism)\n\n### `regex.h`\n\n- [https://stackoverflow.com/questions/1085083/regular-expressions-in-c-examples](https://stackoverflow.com/questions/1085083/regular-expressions-in-c-examples)\n- [https://manpages.ubuntu.com/manpages/trusty/man7/regex.h.7posix.html](https://manpages.ubuntu.com/manpages/trusty/man7/regex.h.7posix.html)\n\n### Testing\n\n- [https://en.wikipedia.org/wiki/List_of_unit_testing_frameworks#C](https://en.wikipedia.org/wiki/List_of_unit_testing_frameworks#C)\n- [https://github.com/siu/minunit](https://github.com/siu/minunit) (minimal)\n- [https://github.com/ThrowTheSwitch/Unity](https://github.com/ThrowTheSwitch/Unity) (average)\n- [https://stackoverflow.com/questions/242926/comparison-of-c-unit-test-frameworks](https://stackoverflow.com/questions/242926/comparison-of-c-unit-test-frameworks)\n- [https://github.com/google/googletest](https://github.com/google/googletest) (very robust)\n- [https://docs.microsoft.com/en-us/visualstudio/test/writing-unit-tests-for-c-cpp?view=vs-2022](https://docs.microsoft.com/en-us/visualstudio/test/writing-unit-tests-for-c-cpp?view=vs-2022) (very robust)\n\n### ASCII Art\n\n- [https://www.asciiart.eu/art-and-design/escher](https://www.asciiart.eu/art-and-design/escher)\n- [https://www.asciiart.eu/art-and-design/borders](https://www.asciiart.eu/art-and-design/borders)\n- [https://www.asciiart.eu/art-and-design/geometries](https://www.asciiart.eu/art-and-design/geometries)\n- [https://www.text-image.com/convert/ascii.html](https://www.text-image.com/convert/ascii.html)\n- [https://textfancy.com/multiline-text-art/](https://textfancy.com/multiline-text-art/)\n\n### Services\n\n- [https://statuspage.freshping.io/22651-42Network](https://statuspage.freshping.io/22651-42Network)\n- [https://www.freshworks.com/website-monitoring/](https://www.freshworks.com/website-monitoring/)\n- [https://github.com/Liurunex/WebSite_Monitoring](https://github.com/Liurunex/WebSite_Monitoring)\n\n### GIF\n\n- https://itsfoss.com/best-gif-recorder-linux/\n- https://ezgif.com/optimize\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flibrity%2Fft_netmon","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flibrity%2Fft_netmon","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flibrity%2Fft_netmon/lists"}