Toon posts:

[Perl] Proxyserver problemen poging twee

Pagina: 1
Acties:

Verwijderd

Topicstarter
hallo,

Ik ben student informatica en we hebben de opdracht gekregen om een proxy server te programmeren. Het is niet de bedoeling om een mega uitgebreide versie te maken maar lieft wel eentje dat naar behoren werkt.

Momenteel hebben we nog twee problemen en dan zou hij af moeten zijn:

wat wil deze foutmelding zeggen:

bad arg lenght for socket::pack_sockaddr_in, length is 0, should be 4 at P:/ActivePer5.8.0/lib/socket.pm line 373

Dat het een probleem is met parameters weet ik ook wel. Maar overal waar ik gezocht heb staat het zo. Waarom lukt het de ene keer wel en de andere keer niet? Ik heb de indruk dat het afhangt van het adres dat je opvraagd (de lengte of zo?)
Iemand een idee en hoe je hem moet oplossen?

Maar het grootste probleem is eigenlijk dit. Wanneer we onze server runnen krijgen we een error op lijn 59. Daar staan een paar regels code om de client versie van de proxyserver te verzorgen. Het server gedeelte zelf werkt wel maar van de moment dat we het client gedeelte er aan toe voegen loopt het mis ...
De code van de proxyserver is als volgt:

code:
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
#!/usr/local/bin/perl

use Socket;
$queuelength = 1;

socket(HANDLE, PF_INET, SOCK_STREAM, getprotobyname('tcp'));
$addr = sockaddr_in(80, INADDR_ANY);
bind(HANDLE, $addr);
listen(HANDLE, $queuelength);
while(true)
{

accept(NEW_HANDLE, HANDLE);

$line=<NEW_HANDLE>;
print $line;

#zoeken wat hij juist moet doen (get? adres?)
@headers = split(' ', $line);
$method = $headers[0];
$requestedDocument = "index.html";
$url = $headers[1];
$httpversion = $headers[2];

$lengte = length($url)-7;
$url = substr($url,7,$lengte);

@temp = split('/', $url);
$url = $temp[0];

print "$method\n";
print "$url\n";

if( $method eq "GET") {


open(FILE, "blacklist.txt") or die "Blacklist bestaat niet";
@banned = <FILE>;
close(FILE);

$toegelaten=0;
$teller=0;

while($teller<=$#banned){
if($banned[$teller] =~ /$url/){
$toegelaten=1;
}
$teller = $teller + 1;
print "$toegelaten toegelaten\n";
}
print "$toegelaten\n";

if($toegelaten == 0){
#send(NEW_HANDLE,"Grrrr", 0);

socket(HANDLE1, PF_INET, SOCK_STREAM, getprotobyname('tcp'));
$addres = sockaddr_in(8080, inet_aton($url));
connect(HANDLE1,$addres) or die "verbinding niet gelukt";
send (HANDLE1, "GET / HTTP/1.1\r\nhost: $url\r\n\r\n",0);
@opvangen = <HANDLE1>;

print @opvangen;

} else {


send(NEW_HANDLE,"<HEAD><TITLE>403 Forbidden</TITLE></HEAD>\n", 0);
send(NEW_HANDLE, "<H1>Forbidden</H1>", 0);
send(NEW_HANDLE, "You don't have permission to access ... de url", 0);
send(NEW_HANDLE, "on this server.<P>", 0);
send(NEW_HANDLE, "<HR>", 0);
send(NEW_HANDLE, "<ADDRESS>...</ADDRESS>", 0);
send(NEW_HANDLE, "</BODY></HTML>", 0);

}


} else {

send(NEW_HANDLE,"$httpver 404 File Not Found\n\n",0);
send(NEW_HANDLE,"<HEAD><TITLE>404 File Not Found</TITLE></HEAD>\n", 0);
send(NEW_HANDLE, "<BODY><H1>File Not Found</H1>\n", 0);
send(NEW_HANDLE, "The requested URL $url was not found on this server.\n",0);
send(NEW_HANDLE, "De server kan alleen een GET afhandelen.\n",0);
send(NEW_HANDLE, "</BODY>", 0); 

}

close(NEW_HANDLE);

}



Is er iemand dat kan helpen want we zitten er zo dicht bij en toch met de handen in het haar ...

Alvast bedankt

Verwijderd

Ik zeg er eerlijk bij dat ik met deze module geen ervaring heb, maar ik zie in alle voorbeelden dat send en connect niet in dezelfde handle gebruikt worden.

Mocht ik gelijk hebben, wat meestal niet het geval is, dan zou het onderstaande moeten werken.

Je zou deze regel weg kunnen laten.
code:
1
connect(HANDLE1,$addres) or die "verbinding niet gelukt";

en dan zou het dit kunnen worden
code:
1
2
3
$addres = sockaddr_in(8080, inet_aton($url));
$send_message = "GET / HTTP/1.1\r\nhost: $url\r\n\r\n";
send (HANDLE1,$sendmessage ,0, $addres) or die "send $!";

Verwijderd

Topicstarter
werkt allemaal heel goed tot het moment dat ik een site probeer te benaderen die niet in de blacklist staat dan krijg ik devolgende error:

send Unknown error at server.pl line 63.

en dan sluit hij af ... Die lijn 63 is dus:
code:
1
send (HANDLE1,$sendmessage ,0, $addres) or die "send $!";

Verwijderd

Je voert nogal wat bewerkingen uit op $url. Klopt deze nog wel?

Verwijderd

Topicstarter
Wel ik veronderstel van wel. Ik haal de http:// er vanaf en soms staat er op het einde van een url nog een / bv http://www.rega.be/ die moet er dan ook nog af zodanig dat ik www.rega.be over hou ...

  • igmar
  • Registratie: April 2000
  • Laatst online: 29-06 18:56

igmar

ISO20022

Verwijderd schreef op 21 October 2003 @ 21:49:
en dan sluit hij af ... Die lijn 63 is dus:
code:
1
send (HANDLE1,$sendmessage ,0, $addres) or die "send $!";
Quote uit de manual van 2 send() :

RETURN VALUE
The calls return the number of characters sent, or -1 if
an error occurred.

Daar kan dus ook 0 uitkomen, en dat is geen error. Bij de meeste socket functies moet je rekening houden met dit soort grappen. Kijk ook even in de perl manual van de functies, er staan over het algemeen nuttige opmerkingen bij

  • Juup
  • Registratie: Februari 2000
  • Niet online
De code is erg onverzorgd. Hier een paar tips om het jezelf makkelijker te maken:
1. use strict; en declareer je variabelen zo laat mogelijk (my what?)
2. use warnings;
3. Indent je code fatsoenlijk. Dat komt de leesbaarheid zeer ten goede waardoor je eerder fouten vindt.
4. Probeer je probleem te isoleren. 't Is effe moeilijk maar als het lukt heb je veel minder variabalen om rekening mee te houden.

Een wappie is iemand die gevallen is voor de (jarenlange) Russische desinformatiecampagnes.
Wantrouwen en confirmation bias doen de rest.

Pagina: 1