200 lines
5.5 KiB
C
200 lines
5.5 KiB
C
|
//////////////////////////////////////////////////
|
||
|
// Bakalarska praca //
|
||
|
// Meno studenta: Tomas Lukac //
|
||
|
// Veduci BP: prof. Ing. Milos Drutarovsky CSc. //
|
||
|
// Skola: KEMT FEI TUKE //
|
||
|
// Datum poslednej upravy: 9.3.2020 //
|
||
|
//////////////////////////////////////////////////
|
||
|
|
||
|
#include "komunikacia.h"
|
||
|
#include "kryptografia.h"
|
||
|
|
||
|
int poslat_subor(WOLFSSL* ssl, WOLFSSL_CTX* ctx, char* cesta)
|
||
|
{
|
||
|
wolfSSL_write(ssl, cesta, 64);
|
||
|
|
||
|
FILE* subor = fopen(cesta, "r");
|
||
|
if(subor == NULL)
|
||
|
{
|
||
|
fprintf(stderr, "Nebolo mozne najst pozadovany subor.\n");
|
||
|
ukoncit_spojenie(ssl, ctx);
|
||
|
return -1;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
printf("Posielam subor.\n");
|
||
|
|
||
|
//nastavi ukazovatel na koniec suboru
|
||
|
//a zisti velkost suboru
|
||
|
fseek(subor, 0, SEEK_END);
|
||
|
long velkost = ftell(subor);
|
||
|
char velkost_suboru[32];
|
||
|
sprintf(velkost_suboru, "%ld", velkost);
|
||
|
printf("Velkost suboru: %s bajtov\n", velkost_suboru);
|
||
|
wolfSSL_write(ssl, velkost_suboru, 32);
|
||
|
|
||
|
//nastavi ukazovatel na zaciatok suboru
|
||
|
//a nacita data zo suboru do pola
|
||
|
char* pole = malloc(velkost);
|
||
|
char* pole_uk = pole;
|
||
|
fseek(subor, 0, SEEK_SET);
|
||
|
fread(pole, 1, velkost, subor);
|
||
|
fclose(subor);
|
||
|
|
||
|
//posielanie jednotlivych bajtov
|
||
|
for(int i = 0; i < velkost + 1; ++i)
|
||
|
{
|
||
|
wolfSSL_write(ssl, pole_uk, velkost);
|
||
|
pole_uk += 1;
|
||
|
}
|
||
|
printf("Subor bol uspesne odoslany.\n");
|
||
|
return 0;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
int prijat_subor(WOLFSSL* ssl, WOLFSSL_CTX* ctx)
|
||
|
{
|
||
|
char* cesta = calloc(100, sizeof(char));
|
||
|
wolfSSL_read(ssl, cesta, 64);
|
||
|
printf("Prebieha prijimanie suboru %s\n", cesta);
|
||
|
|
||
|
//ziskanie informacie od klienta o velkosti odoslaneho suboru
|
||
|
char velkost_suboru[32];
|
||
|
wolfSSL_read(ssl, velkost_suboru, 32);
|
||
|
long velkost = atol(velkost_suboru);
|
||
|
if(velkost < 1)
|
||
|
{
|
||
|
printf("Nastala chyba pri prijati suboru\n");
|
||
|
return -1;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
printf("Velkost suboru: %s bajtov\n", velkost_suboru);
|
||
|
}
|
||
|
|
||
|
//prijem jednotlivych bajtov
|
||
|
char* pole = malloc(velkost);
|
||
|
char* pole_uk = pole;
|
||
|
for(int i = 0; i < velkost + 1; ++i)
|
||
|
{
|
||
|
wolfSSL_read(ssl, pole_uk, velkost);
|
||
|
pole_uk += 1;
|
||
|
}
|
||
|
printf("Subor bol uspesne prijaty.\n");
|
||
|
|
||
|
//zapis nacitanych dat do suboru
|
||
|
FILE* subor = fopen(cesta, "w");
|
||
|
fwrite(pole, 1, velkost, subor);
|
||
|
fclose(subor);
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
int pripojit_na_server(char *ip_adresa, int cislo_portu, int pocet_sekund)
|
||
|
{
|
||
|
struct timeval casovy_interval;
|
||
|
int uspech;
|
||
|
int cislo_soketu;
|
||
|
struct hostent* hostitel;
|
||
|
struct sockaddr_in adresa;
|
||
|
fd_set sada_soketov;
|
||
|
socklen_t velkost_soketu;
|
||
|
int optval;
|
||
|
|
||
|
if((hostitel = gethostbyname(ip_adresa)) == NULL)
|
||
|
{
|
||
|
printf("Nastala chyba pri spracovani nazvu hostitela.\n");
|
||
|
return 0;
|
||
|
}
|
||
|
printf("Vytvaranie soketu...\n");
|
||
|
cislo_soketu = socket(AF_INET, SOCK_STREAM, 0);
|
||
|
memset(&adresa, 0, sizeof(adresa));
|
||
|
adresa.sin_family = AF_INET; //IPv4
|
||
|
adresa.sin_port = htons(cislo_portu);
|
||
|
adresa.sin_addr.s_addr = *(long*)(hostitel->h_addr);
|
||
|
|
||
|
//pokus o pripojenie s casovym intervalom
|
||
|
uspech = connect(cislo_soketu, (struct sockaddr*)&adresa, sizeof(adresa));
|
||
|
if(uspech < 0)
|
||
|
{
|
||
|
if(errno == EINPROGRESS)
|
||
|
{
|
||
|
fprintf(stderr, "Nebolo mozne okamzite vytvorit spojenie\n");
|
||
|
do
|
||
|
{
|
||
|
casovy_interval.tv_sec = pocet_sekund;
|
||
|
casovy_interval.tv_usec = 0;
|
||
|
FD_ZERO(&sada_soketov);
|
||
|
FD_SET(cislo_soketu, &sada_soketov);
|
||
|
uspech = select(cislo_soketu + 1, NULL, &sada_soketov, NULL, &casovy_interval);
|
||
|
if (uspech < 0 && errno != EINTR)
|
||
|
{
|
||
|
fprintf(stderr, "Nastala chyba pri pokuse o vytvorenie spojenia\nCislo chyby: %d\nPopis: %s\n", errno, strerror(errno));
|
||
|
ukoncit_soket(cislo_soketu);
|
||
|
exit(0);
|
||
|
}
|
||
|
//bol zvoleny soket
|
||
|
else if(uspech > 0)
|
||
|
{
|
||
|
velkost_soketu = sizeof(int);
|
||
|
if (getsockopt(cislo_soketu, SOL_SOCKET, SO_ERROR, (void*)(&optval), &velkost_soketu) < 0)
|
||
|
{
|
||
|
fprintf(stderr, "Nastala chyba v nastaveni soketu\nCislo chyby: %d\nPopis: %s\n", errno, strerror(errno));
|
||
|
ukoncit_soket(cislo_soketu);
|
||
|
exit(0);
|
||
|
}
|
||
|
if(optval)
|
||
|
{
|
||
|
fprintf(stderr, "Nastala chyba v spojeni\nCislo chyby: %d\nPopis: %s\n", optval, strerror(optval));
|
||
|
ukoncit_soket(cislo_soketu);
|
||
|
exit(0);
|
||
|
}
|
||
|
break;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
fprintf(stderr, "Casovy interval vyprsal\n");
|
||
|
ukoncit_soket(cislo_soketu);
|
||
|
exit(0);
|
||
|
}
|
||
|
} while(1);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
fprintf(stderr, "Spojenie zlyhalo.\nCislo chyby: %d\nPopis: %s\n", errno, strerror(errno));
|
||
|
ukoncit_soket(cislo_soketu);
|
||
|
exit(0);
|
||
|
}
|
||
|
}
|
||
|
return cislo_soketu;
|
||
|
}
|
||
|
|
||
|
int cakat_na_komunikaciu(int cislo_portu)
|
||
|
{
|
||
|
int cislo_soketu;
|
||
|
struct sockaddr_in adresa;
|
||
|
|
||
|
printf("Vytvaranie socketu...\n");
|
||
|
cislo_soketu = socket(PF_INET, SOCK_STREAM, 0);
|
||
|
memset(&adresa, 0, sizeof(adresa));
|
||
|
adresa.sin_family = AF_INET; //IPv4
|
||
|
adresa.sin_port = htons(cislo_portu);
|
||
|
adresa.sin_addr.s_addr = INADDR_ANY;
|
||
|
|
||
|
if(bind(cislo_soketu, (struct sockaddr*)&adresa, sizeof(adresa)) != 0)
|
||
|
{
|
||
|
fprintf(stderr, "Nebolo mozne priradit soket ku danemu portu.\n");
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
if(listen(cislo_soketu, 10) != 0)
|
||
|
{
|
||
|
fprintf(stderr, "Na danom porte nie je mozne cakat na komunikaciu.\n");
|
||
|
return 0;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
printf("Server caka na komunikaciu na porte %d.\n", cislo_portu);
|
||
|
}
|
||
|
return cislo_soketu;
|
||
|
}
|