Bonjour,

J'ai un gros problème je ne vois pas comment optimiser ce code simple:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
 
#!/usr/bin/perl
 
# Load modules
use Net::PcapUtils;
use NetPacket::Ethernet qw(:strip);
use NetPacket::UDP;
use NetPacket::IP qw(:strip);
use IO::Socket;
use threads;
use Thread::Queue;
 
 
use Socket;
use constant SIMPLE_UDP_PORT => 516;
use constant REMOTE_HOST => '192.168.10.10';
my $trans_serv = getprotobyname( 'udp' );
my $remote_host = gethostbyname( REMOTE_HOST );
my $remote_port = SIMPLE_UDP_PORT;
my $destination = sockaddr_in( $remote_port, $remote_host );
socket( UDP_SOCK, PF_INET, SOCK_DGRAM, $trans_serv );
 
$SIG{CHLD} = 'IGNORE';
 
#my $socket=IO::Socket::INET->new(
#                PeerAddr => '192.168.10.10',
#                PeerPort => '516',
#                Proto => 'udp' );
 
my $queue = Thread::Queue -> new;
 
 
if($> != 0)
{
die "You need EUID 0 to use this tool!\n\n";
}
my $monitor = threads->create ("monitor", $queue);
$monitor->detach();
my $monitor2 = threads->create ("monitor", $queue);
$monitor2->detach();
my $monitor3 = threads->create ("monitor", $queue);
$monitor3->detach();
 
sub monitor {
	while(1){
          #     print "send packet debut fils \n";
	        while (my $request = $queue->dequeue()){
		        send(UDP_SOCK, $packet, 0, $destination);
			threads->yield();		
		}
	}
	print "fin";
}
 
# Callback
sub sniffit
{
my ($args,$header,$packet) = @_;
#print eth_strip($packet)."\n";
#my $ip = NetPacket::IP->decode(eth_strip($packet));
#my $udp = NetPacket::UDP->decode($ip->{data});
$queue->enqueue($request);
}
 
 
# Start sniffin in promisc mode
Net::PcapUtils::loop(\&sniffit,
Promisc => 1,
SNAPLEN => 1000,
FILTER => 'udp and port 516',
DEV => 'eth3');
Je recois des paquets que je forward par la suite à une autre machine.
je n'arrive pas à optimiser la lecture dans ma thread queue: plus j'ai de thread qui lit dedans au plus je consomme en CPU. Mes threads font donc l'inverse de leur boulot... Avez vous une idée pour me debloquer car je recois pas mal de paquet sur mon interface ce qui me fait monter facilement à 30 % d'occupation CPU ce qui est énorme pour ce petit programme...


Merci