Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

TIMESTAMP dei pacchetti INVIATI via sendto

1 view
Skip to first unread message

frakie

unread,
Jul 18, 2008, 11:46:47 AM7/18/08
to
Qualcuno sa come ottenere l'effettivo timestamp d'invio dei pacchetti
inviati dal socket?
In ricezione è possibile utilizzare ioctl con SIOCGSTAMP, ma
nell'invio? la gettimeofday non è sufficientemente accurata, mi
servirebbe possibilmente qualcosa di più vicino all'invio effettivo da
parte della scheda di rete...

Roberto C

unread,
Jul 23, 2008, 4:28:15 AM7/23/08
to
frakie ha scritto:

> Qualcuno sa come ottenere l'effettivo timestamp d'invio dei pacchetti
> inviati dal socket?

> In ricezione č possibile utilizzare ioctl con SIOCGSTAMP, ma
> nell'invio? la gettimeofday non č sufficientemente accurata, mi
> servirebbe possibilmente qualcosa di piů vicino all'invio effettivo da


> parte della scheda di rete...

Non saprei, ma se lo sai ricavare per pacchetti in ricezione puoi provare
a usare un socket packet (non standard, link layer, al di sotto delle
RAW socket). Magari le libpcap propongono qualcosa di interessante.

Comunque dai un' occhiata a

man 7 packet

Specifiche per Linux.
I Pacchetti ricevuti non sono catturati, nel senso che comunque passano
agli altri layer di protocollo. Un po come uno sniffer. Quindi pacchetti
TX solo comunque Ricevuti e forse quella ioctl sata' applicabile.

Ho del codice Perl su cui puoi lavorare.
prova ad eseguire come root il seguente codice con:

/sniffer.pl 768 x
cosa significa 768 e' scritto nei commenti.

#!/usr/bin/perl
use strict;
use Socket;

my $err = 0;
my $str = "";
my $proto = $ARGV[0]; # se 768 ricevo tutti i pacchetti.
my $output = ($ARGV[1] eq 'x') ? "%02x " : "%c";

# 17 sta per PF_PACKET e per $proto == 768 ricevo tutti i pacchetti.
# vedi in /usr/include/linux/if_ether.h linea # define ETH_P_ALL 0x0003
# $proto e' in network-order quindi 0x0003 diviene 0x0300 cioe' 768.

socket(SOCK, 17, SOCK_RAW, $proto) or $err = 1;
if ($err) { print "Errore syscall socket\n"; exit 1;}

# da vedere anche ioctl() e man 7 netdevice

while(1)
{

recv(SOCK,$str, 8192, 0);
# in sprintf il # %#02x se non-zero mette 0xHH
my $outstring = join("", map { sprintf $output, $_ }
unpack("C*", $str)), "n";

if ($output eq "%c") { $outstring =~ s/[^[:print:]]/\./go; }
syswrite STDOUT, $outstring."\n";

}

Come gia' detto, forse le libpcap danno gia' supporto a quanto chiedi e
garantiscono un livello di astrazione sui socket packet non standard
quindi se possibile, soluzioni con pcap sarebbero da preferire anche
in ragione di portabilita' o per cautelarsi da modifiche tra upgrades
del kernel. Quindi suggerisco una occhiata alle libpcap, anche perche'
comunque mettono a disposizione una funzione che restituisce il socket
hendler che internamente stanno usando, quindi ioctl ce lo puoi applicare.

Non so' aiutarti di piu'.

Ciao
Roberto.


--

questo articolo e` stato inviato via web dal servizio gratuito
http://www.newsland.it/news segnala gli abusi ad ab...@newsland.it


0 new messages