PDA

Visualizza la versione completa : Dime. massima di un pacchetto.


LordSaga640
30-03-2004, 15:57
Ciao a tutti.
Ho la necessità di sapere quale è la dim. in byte, massima di un pacchetto e come posso sapere se il pacchetto sarà spezzato o lasciato intero.

Io ho la necessità che arrivi tutti di un pezzo, se mi si divide diventa un pacchetto nulla.

Mi serve integro perchè ho un server che gestisce centinaia di connessioni e la richiesta deve avvenire tutta assieme ma devo anche essere sicuro che mentre la spedisco mi si spezzi e quando la vado a leggere a destinazioni risulti frammentata ed invalida.

Io comprimo i pacchetti con zlib e questo è uno dei motivi per il quale non posso dividerli. O almeno, potriei dividerli ma ci metto il doppio a programmare.
Grazie in anticipo, ciao.

seclimar
30-03-2004, 16:00
pacchetto di cosa??

ma stavi continuando una discussione gia' iniziata?

LordSaga640
30-03-2004, 16:05
ops, scusa.
Mi riferivo ad un pacchetto TCP/IP.

Grazie :ciauz:

seclimar
30-03-2004, 16:12
il pacchetto TCP/IP deve essere spezzabile

tutto e' gia' gestito dal TCP/IP ...
quindi se invii un pacchetto ..anche se viene spezzato... non ci sono problemi poiche' l'applicativo che riceve i dati ...gia' li prende ricostruiti!

(al contrario del UDP)


per la dimensione massima...di sicuro c'e' qualcosa sul sito microsoft cercando MAXMTU o MTU


ma ..a meno che devi fare tu un socket TCP/IP....
il tcp/ip esistente...gia' provvedere a impacchettare e restituire i pacchetti corretti

LordSaga640
30-03-2004, 18:33
Ciao, allora, è un paio di ore che ho programmato per permettere al client di inviare pacchetti massimi di 10KB.

Anche se arrivano spezzati il server li ricostruisce....
In più ho implementato la funzione per decidere se usare o meno la compressione zlib...

CMQ sia, gestire un server è più complicato di quanto immaginassi:


sub buffering {
my $utente=shift;
my $buf=shift;
my $temp;
if($utente->{dim}>0) {
$utente->{buf}.=$buf;
if (length $buf == $utente->{dim}) {
$temp=$utente->{buf};
$utente->{buf}="";
$utente->{dim}=-1;
return uncompress($utente->{buf}) if ($utente->{compresso});
return $utente->{buf};
}
if (length $utente->{buf} > 10240 || length $utente->{buf} > $utente->{dim}) {
$utente->{dim}=-1;
$utente->{buf}="";
}
return undef;
}
return undef if (substr($buf,0,2) ne "\x87\x89");
unpack("C",substr($buf,2,1))>1 ? return undef : ($utente->{compresso}=unpack("C",substr $buf,2,1 ));
unpack("S",substr($buf,3,2))>10240 ? return undef : ($utente->{dim}=unpack("S",substr $buf,3,2));
if ($utente->{dim}==length($buf)-5) {
$utente->{dim}=-1;
print "l'ho inviato subito senza comprimerlo? ".$utente->{compresso}."\n";
return uncompress(substr($buf,5,length($buf)-5)) if $utente->{compresso};
return substr($buf,5,length($buf)-5);
}
$utente->{buf}=substr($buf,5,length($buf)-5);
print "Pacchetto suddiviso in più parti\n";
return undef;
}


Grazie :ciauz:

seclimar
01-04-2004, 11:29
ma cosa devi fare ??
dovresti dirci qualcosa in piu'...

mettiti nei nostri panni...
non sappiamo nulla di cosa stai facendo!

LordSaga640
01-04-2004, 23:12
uhm...nulla.
Un server per un p2p.
Ormai il server l'ho finito...il bello inizia ora con il client. :dhò:
Ma ormai l'ho tutto progettato e se la voglia per portarlo a termine rimane, secondo me viene una cosa carina di tutto rispetto.
Basta solo avere pazienzza che nel programmare è tutto.
:bubu:
ciauz

seclimar
02-04-2004, 10:52
beh...a parere mio ...
non ti devi preoccupare di come il TCP/IP ti spezzetta i pacchetti che mandi!

anche perche' ti garantisce che al destinatario arriveranno ricostruiti...

LordSaga640
02-04-2004, 19:46
bhè si, avevo letto qualcosa del genere sulla cisco.
Il fatto è che se prendo una variabile e la riempio con 10MB di roba e faccio poi:
print $socket $variabile_da_10_MB;
Lui non invia un pacchetto da 10MB ma lo divide, ed è questo il mio problema principale.
Così io ho risolto semplicemente mettendo la dimenzione del pacchetto nei secondi due byte. Così io memorizzo tutto in un buffer fino a quando non ho la dimenzione indicatami dal client.
Metodo semplice ma efficace.
ciao ciao

Loading