Ik wil onderstaand script aanpassen zodat ik de waardes ($send_message) via de commandline mee kan sturen. Het afvangen van de parameters met o.a. print Dumper \@ARGV; gaat goed, alleen kapt het script met de melding :
Uncaught exception from user code:
no socket at ./test.pl line 124.
Als ik het script zonder parameters start werkt het wel goed.
Na wat debuggen kom ik op perlsec/taint mode uit...Alleen is mijn Perl kennis (zeer) te beperkt om nu het probleem te tackelen... Wie kan mij in de goede richting wijzen?
Uncaught exception from user code:
no socket at ./test.pl line 124.
Als ik het script zonder parameters start werkt het wel goed.
Na wat debuggen kom ik op perlsec/taint mode uit...Alleen is mijn Perl kennis (zeer) te beperkt om nu het probleem te tackelen... Wie kan mij in de goede richting wijzen?
Perl:
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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
| #!/usr/bin/perl # # read from velbus and writes to rrd # use strict; use IO::Socket; use POSIX qw/strftime/; use lib qw(/usr/lib/perl5); use POSIX qw/strftime/; sub disp_data { my @dat_array = @_; my $data_count = 0; my $data_size = @dat_array; my $data_buf; for($data_count = 0;$data_count<$data_size;$data_count++){ $data_buf = sprintf("%X ",$dat_array[$data_count]); print ("$data_buf"); } } sub calc_checksum { my @check_array = @_; my $check_return = 0; my $check_count; my $check_size = @check_array; for($check_count=0;$check_count<($check_size-1);$check_count++){ $check_return += $check_array[$check_count]; } $check_return *= -1; $check_return = $check_return & 255; return $check_return; } sub check_valid { my @check_array = @_; my $check_return = 0; my $check_size = @check_array; if (($check_array[0] eq 15) && ($check_array[$check_size-1] eq 4)){ if (calc_checksum(@check_array) eq $check_array[$check_size-2]){ $check_return = 1; } } return $check_return; } sub hex_to_ascii ($) { ## Convert each two-digit hex number back to an ASCII character. (my $str = shift) =~ s/([a-fA-F0-9]{2})/chr(hex $1)/eg; return $str; } sub make_message { my @message = @_; my $return_message = ""; my $make_lenght = @message; my @make_array = (); my @make_array2 = (); my $make_count; my $make_buffer; $make_array[0] = hex "0x0F"; $make_array[1] = $message[0]; $make_array[2] = $message[1]; $make_array[3] = ($message[2] & 240) | (($make_lenght-3) & 15); for($make_count = 0;$make_count <= ($make_lenght-3);$make_count++){ $make_array[$make_count+4] = $message[$make_count+3]; } $make_buffer = calc_checksum(@make_array); $make_array[$make_lenght+1] = $make_buffer; $make_array[$make_lenght+2] = hex "0x04"; $make_lenght = @make_array; @make_array2 = (); for($make_count=0;$make_count < $make_lenght;$make_count++){ $make_array2[$make_count] = chr($make_array[$make_count]); } $return_message = join('',@make_array2); return $return_message; } ### main my @char_array = (); my @data_array = (); my $size; my $count = 0; my $hexad = 0; my $recv_data; my $check = 0; my $send_addres; my @send_message = (); my $send_rtr; my $send_prio; my $ERROR; my $host = shift || 'localhost'; my $port = shift || 3788; my $sock = new IO::Socket::INET( PeerAddr => $host, PeerPort => $port, Proto => 'tcp'); $sock or die "no socket :$!"; $sock->autoflush(1); #send @send_message = (); $send_addres = hex "0x01"; $send_prio = hex "0xF8"; $send_rtr = hex "0x02"; $send_message[0] = hex "0x02"; $send_message[1] = hex "0x01"; print $sock make_message($send_prio,$send_addres,$send_rtr,@send_message); close $sock; |