Prethodna tema :: Sljedeća tema |
Autor/ica |
Poruka |
etaoin shrdlu Forumaš(ica)
Pridružen/a: 23. 09. 2012. (19:15:48) Postovi: (39)16
|
Postano: 15:32 uto, 29. 1. 2013 Naslov: Mreze racunala - zadatak s kolokvija |
|
|
Molim vas za pomoc!
Kolokvij je [url=http://web.math.pmf.unizg.hr/nastava/mreze/kolokviji/2011/kolokvij1-zadaci.pdf]prvi iz 2011./2012.[/url], treci zadatak:
[quote]Napišite funkciju
[code:1]void posalji(int sock, struct X x);[/code:1]
koja putem socketa [tt]sock[/tt] šalje dolje opisanu strukturu [tt]x[/tt]. Obavezno provjerite da li je prilikom slanja
podataka došlo do neočekivanog prekida konekcije ili neke druge pogreške u komunikaciji.
[code:1]struct X {
int i;
char* string1;
char* string2;
};[/code:1]
Napomena: Vrijednost integera [tt]i[/tt] nije povezana s duljinom stringova [tt]string1[/tt] i [tt]string2[/tt].[/quote]
Prvo pitanje je: da li mozemo pretpostaviti da i klijent i server imaju definiranu istu ovakvu strukturu, pa onda samo saljemo int i dva stringa, koje onda funkcija za primanje prebacuje na odgovarajuca mjesta u strukturi? No, smijemo li to pretpostaviti?
Drugo pitanje: smijemo li slati i neke dodatne podatke koji nisu u strukturi, npr. duljinu stringa?
Trece pitanje: moze li netko staviti cijeli kod rjesenja? Bio bih jako zahvalan! :D
Puno hvala! :)
Molim vas za pomoc!
Kolokvij je prvi iz 2011./2012., treci zadatak:
Citat: | Napišite funkciju
Kod: | void posalji(int sock, struct X x); |
koja putem socketa sock šalje dolje opisanu strukturu x. Obavezno provjerite da li je prilikom slanja
podataka došlo do neočekivanog prekida konekcije ili neke druge pogreške u komunikaciji.
Kod: | struct X {
int i;
char* string1;
char* string2;
}; |
Napomena: Vrijednost integera i nije povezana s duljinom stringova string1 i string2. |
Prvo pitanje je: da li mozemo pretpostaviti da i klijent i server imaju definiranu istu ovakvu strukturu, pa onda samo saljemo int i dva stringa, koje onda funkcija za primanje prebacuje na odgovarajuca mjesta u strukturi? No, smijemo li to pretpostaviti?
Drugo pitanje: smijemo li slati i neke dodatne podatke koji nisu u strukturi, npr. duljinu stringa?
Trece pitanje: moze li netko staviti cijeli kod rjesenja? Bio bih jako zahvalan!
Puno hvala!
|
|
[Vrh] |
|
mdoko Forumaš(ica)
Pridružen/a: 30. 11. 2002. (22:17:12) Postovi: (71A)16
Spol:
Lokacija: Heriot-Watt University, Edinburgh
|
Postano: 16:04 uto, 29. 1. 2013 Naslov: Re: Mreze racunala - zadatak s kolokvija |
|
|
[quote="etaoin shrdlu"]
Prvo pitanje je: da li mozemo pretpostaviti da i klijent i server imaju definiranu istu ovakvu strukturu, pa onda samo saljemo int i dva stringa, koje onda funkcija za primanje prebacuje na odgovarajuca mjesta u strukturi? No, smijemo li to pretpostaviti?
[/quote]
Slanjem jednog inta i dva stringa ne uvodite nikakve dodatne pretpostavke. To je jedini način na koji se ispravno može poslati tako definirana struktura.
[quote]
Drugo pitanje: smijemo li slati i neke dodatne podatke koji nisu u strukturi, npr. duljinu stringa?
[/quote]
Naravno da smijete.
[quote]
Trece pitanje: moze li netko staviti cijeli kod rjesenja?[/quote]
[code:1]int posalji_int(int sock, int integer){
integer = htonl(integer);
if( send(sock, &integer, sizeof(integer), 0) != sizeof(integer) ){
fprintf(stderr, "Error sending int.\n");
return 0;
}
return 1;
}
int posalji_string(int sock, const char* str){
int length = strlen(str);
if( !posalji_int(sock, length) ) return 0;
int sent = 0;
while( sent != length ){
int newly_sent = send(sock, str + sent, length - sent, 0);
if(newly_sent <= 0){
fprintf(stderr, "Error sending string.\n");
return 0;
}
sent += newly_sent;
}
return 1;
}
void posalji(int sock, struct X x){
if( !posalji_int(sock, x.i) ) return;
if( !posalji_string(sock, x.string1) ) return;
posalji_string(sock, x.string2);
}[/code:1]
etaoin shrdlu (napisa): |
Prvo pitanje je: da li mozemo pretpostaviti da i klijent i server imaju definiranu istu ovakvu strukturu, pa onda samo saljemo int i dva stringa, koje onda funkcija za primanje prebacuje na odgovarajuca mjesta u strukturi? No, smijemo li to pretpostaviti?
|
Slanjem jednog inta i dva stringa ne uvodite nikakve dodatne pretpostavke. To je jedini način na koji se ispravno može poslati tako definirana struktura.
Citat: |
Drugo pitanje: smijemo li slati i neke dodatne podatke koji nisu u strukturi, npr. duljinu stringa?
|
Naravno da smijete.
Citat: |
Trece pitanje: moze li netko staviti cijeli kod rjesenja? |
Kod: | int posalji_int(int sock, int integer){
integer = htonl(integer);
if( send(sock, &integer, sizeof(integer), 0) != sizeof(integer) ){
fprintf(stderr, "Error sending int.\n");
return 0;
}
return 1;
}
int posalji_string(int sock, const char* str){
int length = strlen(str);
if( !posalji_int(sock, length) ) return 0;
int sent = 0;
while( sent != length ){
int newly_sent = send(sock, str + sent, length - sent, 0);
if(newly_sent <= 0){
fprintf(stderr, "Error sending string.\n");
return 0;
}
sent += newly_sent;
}
return 1;
}
void posalji(int sock, struct X x){
if( !posalji_int(sock, x.i) ) return;
if( !posalji_string(sock, x.string1) ) return;
posalji_string(sock, x.string2);
} |
_________________ Extraordinary claims require extraordinary evidence. – Carl Sagan
|
|
[Vrh] |
|
etaoin shrdlu Forumaš(ica)
Pridružen/a: 23. 09. 2012. (19:15:48) Postovi: (39)16
|
|
[Vrh] |
|
newone Forumaš(ica)
Pridružen/a: 10. 01. 2013. (20:20:07) Postovi: (B)16
|
|
[Vrh] |
|
mdoko Forumaš(ica)
Pridružen/a: 30. 11. 2002. (22:17:12) Postovi: (71A)16
Spol:
Lokacija: Heriot-Watt University, Edinburgh
|
|
[Vrh] |
|
kakt00s Forumaš(ica)
Pridružen/a: 17. 10. 2007. (12:19:40) Postovi: (183)16
Spol:
Lokacija: :ɐɾıɔɐʞoן
|
|
[Vrh] |
|
etaoin shrdlu Forumaš(ica)
Pridružen/a: 23. 09. 2012. (19:15:48) Postovi: (39)16
|
|
[Vrh] |
|
holidayRainbowLights Forumaš(ica)
Pridružen/a: 28. 03. 2012. (23:58:54) Postovi: (11)16
Spol:
|
|
[Vrh] |
|
mdoko Forumaš(ica)
Pridružen/a: 30. 11. 2002. (22:17:12) Postovi: (71A)16
Spol:
Lokacija: Heriot-Watt University, Edinburgh
|
|
[Vrh] |
|
etaoin shrdlu Forumaš(ica)
Pridružen/a: 23. 09. 2012. (19:15:48) Postovi: (39)16
|
|
[Vrh] |
|
kakt00s Forumaš(ica)
Pridružen/a: 17. 10. 2007. (12:19:40) Postovi: (183)16
Spol:
Lokacija: :ɐɾıɔɐʞoן
|
|
[Vrh] |
|
aboll Forumaš(ica)
Pridružen/a: 22. 10. 2012. (09:12:16) Postovi: (3)16
|
|
[Vrh] |
|
mdoko Forumaš(ica)
Pridružen/a: 30. 11. 2002. (22:17:12) Postovi: (71A)16
Spol:
Lokacija: Heriot-Watt University, Edinburgh
|
Postano: 14:37 sri, 6. 2. 2013 Naslov: |
|
|
[quote="aboll"]Molim vas ako bi netko mogao napisati rješenje 2. zadatka iz završnog ispita? Bar otprilike...[/quote]
Evo rješenja i to sa svim mogućim provjerama i ispisima poruka o greškama koje se mogu javiti (za obje grupe):
[code:1]int posalji_int(int sock, int integer){
integer = htonl(integer);
if( send(sock, &integer, sizeof(integer), 0) != sizeof(integer) ){
fprintf(stderr, "Error sending int.\n");
return 0;
}
return 1;
}
int primi_int(int sock, int* integer){
if( recv(sock, integer, sizeof(*integer), 0) != sizeof(*integer) ){
fprintf(stderr, "Error receiving int.\n");
return 0;
} else {
*integer = ntohl(*integer);
return 1;
}
}
int posalji_string(int sock, const char* str){
int length = strlen(str);
if( !posalji_int(sock, length) ) return 0;
int sent = 0;
while( sent != length ){
int newly_sent = send(sock, str + sent, length - sent, 0);
if(newly_sent <= 0){
fprintf(stderr, "Error sending string.\n");
return 0;
}
sent += newly_sent;
}
return 1;
}
int primi_string(int sock, char** str){
int length;
if( !primi_int(sock, &length) ){
*str = NULL;
return 0;
}
if( (*str = calloc((length + 1), sizeof(**str))) == NULL ){
fprintf(stderr, "Memory allocation fault.\n");
return 0;
}
int received = 0;
while( received != length ){
int newly_received = recv(sock, *str + received, length - received, 0);
if(newly_received <= 0){
fprintf(stderr, "Error receiving string.\n");
return 0;
}
received += newly_received;
}
return 1;
}
/*
* Napisite odgovarajuce funkcije posalji/primi, koje ce na odredjeni socket poslatil/primiti niz od n stringova.
* Obratite paznju da samo posiljatelj zna koliki je n, a niz stringova reprezentirajte tipom char**.
* /
void posalji_A(int sock, const char** str, int length){
if( posalji_int(sock, length) ){
for(int i = 0; i < length && posalji_string(sock, str[i]); ++i);
}
}
void primi_A(int sock, char*** str, int* length){
if( primi_int(sock, &length) ){
if( (*str = calloc(length, sizeof(**str))) == NULL ){
fprintf(stderr, "Memory allocation fault.\n");
return;
}
for(int i = 0; i < length && primi_string(sock, (*str) + i); ++i);
}
}
/*
* Napisite odgovarajuce funkcije posalji/primi, koje ce na odredjeni socket poslati niz stringova.
* Niz stringova reprezentirajte tipom char**, a posljednji element niza je NULL.
*/
void posalji_B(int sock, const char** str, int length){
int length;
for(length = 0; str[length] != NULL; ++length);
if( posalji_int(sock, length) ){
for(int i = 0; i < length && posalji_string(sock, str[i]); ++i);
}
}
void primi_B(int sock, char*** str, int* length){
if( primi_int(sock, &length) ){
if( (*str = calloc((length + 1), sizeof(**str))) == NULL ){
fprintf(stderr, "Memory allocation fault.\n");
return;
}
for(int i = 0; i < length && primi_string(sock, (*str) + i); ++i);
}
}[/code:1]
Edit: popravljeni tipfeleri.
aboll (napisa): | Molim vas ako bi netko mogao napisati rješenje 2. zadatka iz završnog ispita? Bar otprilike... |
Evo rješenja i to sa svim mogućim provjerama i ispisima poruka o greškama koje se mogu javiti (za obje grupe):
Kod: | int posalji_int(int sock, int integer){
integer = htonl(integer);
if( send(sock, &integer, sizeof(integer), 0) != sizeof(integer) ){
fprintf(stderr, "Error sending int.\n");
return 0;
}
return 1;
}
int primi_int(int sock, int* integer){
if( recv(sock, integer, sizeof(*integer), 0) != sizeof(*integer) ){
fprintf(stderr, "Error receiving int.\n");
return 0;
} else {
*integer = ntohl(*integer);
return 1;
}
}
int posalji_string(int sock, const char* str){
int length = strlen(str);
if( !posalji_int(sock, length) ) return 0;
int sent = 0;
while( sent != length ){
int newly_sent = send(sock, str + sent, length - sent, 0);
if(newly_sent <= 0){
fprintf(stderr, "Error sending string.\n");
return 0;
}
sent += newly_sent;
}
return 1;
}
int primi_string(int sock, char** str){
int length;
if( !primi_int(sock, &length) ){
*str = NULL;
return 0;
}
if( (*str = calloc((length + 1), sizeof(**str))) == NULL ){
fprintf(stderr, "Memory allocation fault.\n");
return 0;
}
int received = 0;
while( received != length ){
int newly_received = recv(sock, *str + received, length - received, 0);
if(newly_received <= 0){
fprintf(stderr, "Error receiving string.\n");
return 0;
}
received += newly_received;
}
return 1;
}
/*
* Napisite odgovarajuce funkcije posalji/primi, koje ce na odredjeni socket poslatil/primiti niz od n stringova.
* Obratite paznju da samo posiljatelj zna koliki je n, a niz stringova reprezentirajte tipom char**.
* /
void posalji_A(int sock, const char** str, int length){
if( posalji_int(sock, length) ){
for(int i = 0; i < length && posalji_string(sock, str[i]); ++i);
}
}
void primi_A(int sock, char*** str, int* length){
if( primi_int(sock, &length) ){
if( (*str = calloc(length, sizeof(**str))) == NULL ){
fprintf(stderr, "Memory allocation fault.\n");
return;
}
for(int i = 0; i < length && primi_string(sock, (*str) + i); ++i);
}
}
/*
* Napisite odgovarajuce funkcije posalji/primi, koje ce na odredjeni socket poslati niz stringova.
* Niz stringova reprezentirajte tipom char**, a posljednji element niza je NULL.
*/
void posalji_B(int sock, const char** str, int length){
int length;
for(length = 0; str[length] != NULL; ++length);
if( posalji_int(sock, length) ){
for(int i = 0; i < length && posalji_string(sock, str[i]); ++i);
}
}
void primi_B(int sock, char*** str, int* length){
if( primi_int(sock, &length) ){
if( (*str = calloc((length + 1), sizeof(**str))) == NULL ){
fprintf(stderr, "Memory allocation fault.\n");
return;
}
for(int i = 0; i < length && primi_string(sock, (*str) + i); ++i);
}
} |
Edit: popravljeni tipfeleri.
_________________ Extraordinary claims require extraordinary evidence. – Carl Sagan
Zadnja promjena: mdoko; 16:30 sri, 6. 2. 2013; ukupno mijenjano 1 put.
|
|
[Vrh] |
|
aboll Forumaš(ica)
Pridružen/a: 22. 10. 2012. (09:12:16) Postovi: (3)16
|
|
[Vrh] |
|
newone Forumaš(ica)
Pridružen/a: 10. 01. 2013. (20:20:07) Postovi: (B)16
|
|
[Vrh] |
|
mdoko Forumaš(ica)
Pridružen/a: 30. 11. 2002. (22:17:12) Postovi: (71A)16
Spol:
Lokacija: Heriot-Watt University, Edinburgh
|
|
[Vrh] |
|
kakt00s Forumaš(ica)
Pridružen/a: 17. 10. 2007. (12:19:40) Postovi: (183)16
Spol:
Lokacija: :ɐɾıɔɐʞoן
|
|
[Vrh] |
|
|