Built a client-server application using TCP and UDP sockets, in which the clients can subscribe/unsubscribe to various topics.

Overview
Nume: Dragne Lavinia-Stefana
Grupa: 324 CA

				PROTOCOALE DE COMUNICATIE
				      - Tema #2 - 
			 Aplicatie client-server TCP si UDP pentru
				  gestionarea mesajelor


	Continutul proiectului este urmatorul:
	
	- helpers.h, functions.h	

	- server.cpp, subscriber.cpp, functions.cpp
	
	- Makefile 

	- acest fisier README.

	Descrierea solutiei:
	
	* Am pornit de la implementarile folosite in laboratoarele 7 si 8, pe care le-am extins pentru
a permite un numar multiplu de conexiuni si pentru a rula clientul intr-un mod diferit, id-ul facand
parte din comanda primita la stdin, acum.
	
	Structuri folosite:

	Pentru a eficientiza timpul de raspuns al serverului la cererile, de mesaje, am ales
	sa folosesc urmatoarele structuri de date:
	
	-> o structura denumita client, in care sunt retinute: id-ul, un dictionar cu topicurile
	la care este abonat, pe baza numelui topicului ca si key, o coada de mesaje ce urmeaza sa
	le primeasca, daca revine online, socket-ul, de pe care s-a conectat si statusul curent
        (conectat sau deconectat);
	-> o structura de mesaj primit de la clientul udp, care contine topicul, type-ul mesajului
	si valoarea efectiva;
	-> o structura de mesaj primit de la clientul tcp, care contine type-ul mesajului, 
	topicul la care se aboneaza si sf-ul aferent;
	-> o structura de mesaj trimis de server catre clientul tcp, care contine id-ul si portul
 	clientului udp, care a furnizat informatia, cat si topicul, type-ul mesajului si payload-ul
	in sine;
	-> un map de clienti, ce primeste ca si cheie un string, reprezentand id-ul unui client si
	intoarce structura, cu informatiile referitoare la clientul respectiv;
	-> un map de sockets, ce primeste ca si cheie un numar de socket si intoarce clientul 
	corespunzator, conectat pe acel socket;
	-> un map de topics, care pe baza numelui topicului, intoarce lista de clienti, abonati la
 	acel topic;
	
	
	Implementare subscriber:

	* Verific numarul de argumente primite de la tastatura si in caz de eroare, afisez un mesaj
corespunzator.
	* Memorez si verific daca s-au primit corect datele despre id-ul clientului, ip-ul serverului
si portul acestuia.
	* Creez un nou socket si completez campurile structurii de tip sockaddr_in cu datele primite,
ulterior conectandu-ma la portul si ip-ul serverului. Trimit serverului id-ul clientului.
	* Se dezactiveaza algoritmul lui Neagle, pentru a obtine o comunicatie cu latenta scazuta si
se sterg toti file descriptorii existenti din set, adaugandu-se ulterior socket-ul curent si STDIN-ul,
in multimea de read_fds. 
	* Daca se citesc date de la tastatura, se verifica daca acestea sunt, sau nu, o comanda de
"exit" si in caz afirmativ, se trimite un mesaj gol catre server, pentru a-l anunta de inchiderea
conexiunii. Se parseaza mesajul citit, folosind functia sscanf si in caz de eroare se intoarce un
mesaj specific. Topicul, type-ul mesajului si sf-ul (transformat cu ajutorul functiei atoi in int)
sunt retinute intr-o structura de tip msg_tcp_to_server si trimise la server. In cazul in care type-ul
este de subscribe sau unsubscribe, se afiseaza pe ecran un mesaj specific.
	* Daca se primesc date de la server, se verifica daca mesajul nu este gol, indicator pentru
inchiderea conexiunii si in caz afirmativ se goleste setul de file descriptori si se elibereaza 
memoria. In caz contrar, se aloca o structura de tip msg_server_to_tcp, pentru care se verifica tipul
de date primit ca si int, folosind functia convert_data_type si se afiseaza string-ul caracteristic.

	Implementare server:

	* Se golesc multimile de file descriptori si se deschide 2 socketi pentru comunicarea cu 
clientul tcp si udp. Se completeaza datele din structura sockaddr_in pentru clienti, folosind functia
complete_struct_addr si se adauga file destriptorii in set. 
	* Se verifica daca este un mesaj primit de la tastatura si daca este comanda exit. In caz
afirmativ se trimite, folosind functia send_exit_msg, un mesaj gol catre clienti pentru a inchide
conexiunea.

	* Daca este un mesaj primit de la clientul udp:

		-> Se aloca si se retine acesta intr-o structura de tip msg_from_udp. Se copiaza din
buffer-ul primit camp cu camp in structura, folosindu-se functia complete_msg_from_udp.
		-> Se aloca o structura de tip msg_server_to_tcp si se completeaza campurile
acesteia, facandu-se conversiile corespunzatoare, pentru type-ul mesajului primit de la udp, in
functia complete_val_msg. 
		-> Se cauta in map-ul de topicuri, topicul primit de la udp si in cazul in care
acesta nu exista i se asociaza o lista goala de clienti abonati. Daca topicul se regaseste in
map se trimite mesajul catre clientii tcp, cu ajutorul functiei manage_msg_from_udp. 
		-> Aceasta parcurge listele de clienti abonati la acel topic si celor care sunt
online le trimite mesajul. Celor care sunt offline si au sf-ul = 1 pentru acel topic, le adauga
mesajul de la udp intr-o coada, specifica fiecarui client. 
	* Daca este un mesaj de la clientul tcp:
		-> Se adauga socket-ul intors de apelul functiei accept in multimea de file
descriptori.
		-> Se cauta id-ul clientului primit in map-ul de clients si in cazul in care se
gaseste si are deja statusul online se afiseaza un mesaj caracteristic.
		-> Daca era offline si acum se reconecteaza, se schimba statusul, se actualizeaza 
socket-ul corespunzator, din structura client si din map-ul de sockets si i se trimit mesajele din
coada de offline messages, folosind functia send_msg_from_queue. 
		-> Daca acesta nu se afla in map-ul de clients este adaugat atat in el, cat si
in map-ul de sockets, afisandu-se un mesaj corespunzator pe ecran.

	* Daca se primesc date de la unul dintre clientii tcp:

		-> Pe baza socket-ului, se gaseste, in map, clientul ce vrea sa comunice cu serverul.
Daca mesajul primit este unul gol, inseamna ca conexiunea s-a inchis si trebuie afisat un mesaj 
coresounzator si scos socketul inchis din multimea de file descriptori.
		-> Daca mesajul continea date, se stocheaza intr-o structura de tip msg_tcp_to_server,
copiindu-se din buffer, camp cu camp, cu ajutorul functiei memcpy. 
		-> Daca clientul se aboneaza la topic, acesta este adaugat in map-ul de topics,
daca nu exista, si topicul in map-ul de subscriptions, corespunzator structurii client. Daca topic-ul
exista, trebuie doar sa ii fie actualizat sf-ul.
		-> Daca clientul se dezaboneaza, se verifica daca era abonat la acel topic si in caz
contrar, se afiseaza un mesaj corespunzator. Daca era abonat, se sterge topic-ul din map-ul de
subscriptions si clientul din map-ul de topics cu ajutorul functiei erase_subscriptions.

	Protocol folosit:
	Am folosit, pentru trimiterea datelor de la clientul tcp la server, o structura de date
denumita msg_tcp_to_server, cu campurile type, topic si sf. Serverul trimite catre clientii tcp
un mesaj, intr-o structura denumita msg_server_to_tcp si primeste mesaje de la clientii udp,
folosindu-se de structura msg_from_udp. De asemenea, clientul tcp trimite catre server intai id-ul,
ulterior datele. Un mesaj cu un continut gol va semnifica ca se doreste inchiderea conexiunii.


	-> Probleme intampinate
	1. Dificultate in a face debug, uneori manual testele treceau dar pe checker nu, din cauza
	unor lacune in enunt, precum lipsa precizarii ierarhiei de directoare folosite pentru a
	rula clientul udp si checker-ul. Am rezolvat problema citind intrebarile si raspunsurile
	de pe forum.
	2. Poate ca era utila si o rubrica pentru a incarca pe vmchecker, asa stiam sigur daca tema
	se comporta corespunzator pe un mediu arbitrar.
	
	-> Referinte
	1. Laboratoarele de PC 6, 7 si 8 (laboratorul 8 este folosit ca si schelet atat pentru
	   implementare, cat si pentru Makefile).
	
	













Mongoose Embedded Web Server Library - a multi-protocol embedded networking library with TCP/UDP, HTTP, WebSocket, MQTT built-in protocols, async DNS resolver, and non-blocking API.

Mongoose - Embedded Web Server / Embedded Networking Library Mongoose is a networking library for C/C++. It implements event-driven non-blocking APIs

Cesanta Software 8.5k Jun 29, 2022
Ultra fast and low latency asynchronous socket server & client C++ library with support TCP, SSL, UDP, HTTP, HTTPS, WebSocket protocols and 10K connections problem solution

CppServer Ultra fast and low latency asynchronous socket server & client C++ library with support TCP, SSL, UDP, HTTP, HTTPS, WebSocket protocols and

Ivan Shynkarenka 848 Jun 26, 2022
Creating a server-client application with C sockets.

C-ServerClient Creating a server-client application with C socket. How to use? Clone the project and cd in to the main directory. Open a terminal and

AmirH.Najafizadeh 7 Nov 15, 2021
A Tcp/Ip stack implementation on top of Solarflare ef_vi, and a C++ headers only framework for tcp multiplexing client/server.

Efvitcp Efvitcp is a tcp library using Solarflare ef_vi interface on linux, and also a tcp multiplexing framework for both C++ client and server progr

Meng Rao 17 Jun 9, 2022
an easy implementation of a multi-process tcp server and a multi-thread tcp client

一个TCP多进程服务器-多线程客户端的简单实现。 客户端类似Apache ab的测试功能,能够通过向某一个ip端口发送指定并发量和总数量的tcp短连接;服务端处理tcp短连接,每来一条消息就打印一条log。 使用cmake编译,建议在vscode里编译,或者命令行 # 终端进入目录 mkdir bu

adin 1 Nov 28, 2021
TCP based publish-subscribe library

tcp_pubsub - TCP Publish/Subscribe library tcp_pubsub is a minimal publish-subscribe library that transports data via TCP. The project is CMake based.

Continental 11 Jul 1, 2022
A simple tcp tunnel on c using sockets Right now it only supports linux systems

A simple tcp tunnel on c using sockets Right now it only supports linux systems build BY MAKE mkdir build make cd build ./tunnel.o <localport> <rem

notaweeb 8 Sep 20, 2021
Simple local P2P chat on UDP sockets

Local P2P Chat This is a fully decentralized chat. To communicate, simply run it on computers in a single local network (using one port). All messages

Anton Khalitov 15 Apr 13, 2022
A protocol for secure client/server connections over UDP

netcode netcode is a simple connection based client/server protocol built on top of UDP. It has the following features: Encrypted and signed packets S

The Network Protocol Company 2.2k Jun 26, 2022
A protocol for secure client/server connections over UDP

netcode netcode is a simple connection based client/server protocol built on top of UDP. It has the following features: Encrypted and signed packets S

The Network Protocol Company 2.2k Jun 26, 2022
Winpcap-based network packet capture tool, support TLS (part), UDP, ICMP, TCP, ARP, DNS and other protocol analysis, interface reference wireshark.

Winpcap-based network packet capture tool, support TLS (part), UDP, ICMP, TCP, ARP, DNS and other protocol analysis, interface reference wireshark.

null 35 Jun 25, 2022
Portable, single-file, protocol-agnostic TCP and UDP socket wrapper, primarily for game networking

Documentation This is a header-only library, as such most of its functional documentation is contained within the "header section" of the source code

null 62 Mar 23, 2022
A modern C++ network library for developing high performance network services in TCP/UDP/HTTP protocols.

evpp Introduction 中文说明 evpp is a modern C++ network library for developing high performance network services using TCP/UDP/HTTP protocols. evpp provid

Qihoo 360 3k Jun 27, 2022
A TCP / UDP program supporting multiple test scenarios

sock_test A TCP / UDP program supporting multiple test scenarios The current communication protocol only supports UDP. TCP will be supported later. Ho

null 4 Mar 8, 2022
Wrapper for linux TCP/UDP/unix/USB socket connections

Socket Connection wrapper shared library Shared library that realize sockets connections and could transfer data-packages. Navigation Navigation Insta

Dmitry Golgovsky 7 Dec 21, 2021
📡 TCP/UDP port redirector

rinetd, by Thomas Boutell and Sam Hocevar. Released under the terms of the GNU General Public License, version 2 or later. This program is used to eff

Sam Hocevar 420 Jun 28, 2022
The standard Packet Batch application that uses standard Linux sockets (AF_PACKETv3) for packet generation.

Packet Batch (Standard) Description This is the standard Packet Batch application that utilizes AF_PACKETv3 Linux sockets. Due to AF_PACKETv3 Linux so

Packet Batch 5 Feb 24, 2022
Simple Tcp Chat Client / Server written in C++

What this TcpXat TcpXat Is A Simple Tcp Chat Setup TcpXat sudo apt install make;make client;make serv;echo "done by FuryM3m0ry"; How To Run TcpXat Ter

sami 1 Dec 28, 2021
Windows named pipe server that forwards connections to given TCP server

PipeTcp An asynchronous Windows named pipe server that forwards connections to given TCP server. Pre-built binaries can be found in Releases. Invocati

Jinoh Kang 4 May 23, 2022