Sunteți pe pagina 1din 9

Proiect - Retele de

calculatoare

Student: Scarlat Simona Ileana


grupa 1068, seria A, Informatica economica

Facultatea de Cibernetica, Statistica si Informatica economica

Definirea problemei:
Comunicarea pe internet este bazata pe o pereche de protocoale numite : Internet
Protocol si Transmission Control Protocol, recunoscuta ca TCP/IP.
Pentru ca doua programe sa comunice folosind TCP/IP, fiecare program trebuie sa creeze
un socket, iar acestea trebuie sa fie conectate. Odata ce conexiunea este facuta, comunicarea
se face folosind transferul de date (input si output).
TCP asigura un serviciu orientat pe conexiune pentru transmisia fiabila a datelor, cu
detectarea erorilor si controlul fluxului, si detine un mecanism de validare n 3 faze, acestea
fiind:
1. stabilirea conexiunii (handshaking)
2. transferul datelor
3. eliberarea conexiunii
Programul care creeaza un socket ce asculta pentru cereri se numeste server, iar
socket-ul aferent server-socket. Programul care se conecteaza la server se numeste client, iar
socket-ul folosit pentru a crea conexiunea se numeste socket-client. Acest lucru poarta
denumirea de model client/server.

In multe aplicatii, server-ul poate accepta conexiuni la mai multi client. Cand un client se
conecteaza la socket-ul unui server, acel socket continua sa asculte. Server-ul are un fir
principal(thread) care directioneaza socket-ul de ascultare al server-ului. Acest main thread
functioneaza pe toata durata de executie a programului. Cand acesta primeste o cerere de
conexiune de la un client, firul principal creeaza un nou fir pentru a se ocupa de conexiunea
cu acel client. Acest fir va functiona doar pe perioada in care clientul sta conectat. Thread-ul
serverului si thread-urile create pentru client functioneaza simultan, in paralel.

Enuntul problemei
Am implementat un sistem client server in limbajul de programare C, programul
putand fi folosit pe Linux. Odata ce clientul este conectat si trimite adresa IP
serverului, acesta din urma trimite data si ora clientului.

Textul sursa (in C pentru Linux) pentru un server care asteapta conectarea unui
client si trimite data si ora curenta.

Modul ServerTCP
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <time.h>

int main(int argc, char *argv[])


{
//listenfd este un intreg redefinit ca socket analog unui descriptor de fisier returnat de
catre apelul functiei socket de mai jos
int listenfd = 0, connfd = 0;
struct sockaddr_in serv_addr; //adresa server

//zona de memorie ce contine date utile


char sendBuff[1025];
time_t ticks;
//atunci cand se apeleaza functia socket(), se creeaza un socket in interiorul nucleului si
returneaza un numar intreg cunoscut sub numele de descriptor socket

Tipul interfetei socket.


Conexiune punct la la punct,
flux de date bidirectional la
nivel de octet, livrare sigura,
cu pastrarea ordinii octetilor

Familia de

listenfd = socket(AF_INET, SOCK_STREAM, 0);


//Asociaza socketului o adresa de server
memset(&serv_addr, '0', sizeof(serv_addr));
memset(sendBuff, '0', sizeof(sendBuff));

serv_addr.sin_family = AF_INET; //constant pt Ipv4

Tip intreg pe 4
octeti

serv_addr.sin_addr.s_addr = htonl(INADDR_ANY); //contine adresa IP


serv_addr.sin_port = htons(6808); //contine numarul portului
//se apeleaza functia bind pentru a specifica portul local pentru socket, la acest port
serverul va astepta cererea clientului
bind(listenfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr));
//plaseaza socket-ul in mod pasiv, apoi in bucla
//functia listen() arata disponibilitatea de a accepta conectari
listen(listenfd, 10);

while(1)

Nr maxim de
clienti conectati

{
//se apeleaza functia accept() pentru a accepta o cerere de conectare si pentru a se crea
un socket nou pentru aceasta conectare
connfd = accept(listenfd, (struct sockaddr*)NULL, NULL);

ticks = time(NULL);
snprintf(sendBuff, sizeof(sendBuff), "%.24s\r\n", ctime(&ticks));
write(connfd, sendBuff, strlen(sendBuff));
//functia close() distruge socket-ul pentru eliberarea resurselor ocupate de socket
close(connfd);
sleep(1);
}
}

Modul Client TCP


Textul sursa (in C pentru Linux) pentru un client care transmite adresa IP si
primeste de la server data si ora curenta.
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <netdb.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <arpa/inet.h>

int main(int argc, char *argv[])


{
int sockfd = 0, n = 0;
//zona de memorie ce contine date utile
char recvBuff[1024];
//adresa server
struct sockaddr_in serv_addr;
if(argc != 2)

{
printf("\n Usage: %s <ip server> \n",argv[0]);
return 1;
}

memset(recvBuff, '0',sizeof(recvBuff));
if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
{
printf("\n Eroare la crearea socket-ului \n");
return 1;
}

printf("A creat socket-ul....\n");


memset(&serv_addr, '0', sizeof(serv_addr));
//preia informatiile despre server
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(6808);

printf("A preluat informatiile despre server....\n");


if(inet_pton(AF_INET, argv[1], &serv_addr.sin_addr)<=0)
{
printf("\n inet_pton error occured\n");
return 1;

}
if( connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0)
{
printf("\n Eroare la obtinerea conexiunii \n");
return 1;
}

printf("A realizat conexiunea.....\n");

while ( (n = read(sockfd, recvBuff, sizeof(recvBuff)-1)) > 0)


{
recvBuff[n] = 0;
if(fputs(recvBuff, stdout) == EOF)
{
printf("\n Error : Fputs error\n");
}
}

if(n < 0)
{
printf("\n Eroare la receptie \n");
}

return 0;
}

Clientul a primit data si


ora de la server

S-ar putea să vă placă și