[Perl] sockets en files doorsturen

Pagina: 1
Acties:

  • Kapoen
  • Registratie: Mei 2002
  • Laatst online: 22:10
Ben op dit moment de laatste hand aan het leggen
aan een klein webservertje (schoolopdracht)

Ik kan met mijn servertje perfect html bestandjes en
andere soorten tekst bestanden aanbieden.
Wil ik echter een gif file of een ander type bestand (zip,jpeg,...)
doorsturen loopt het mis.

Zo stuur ik nu bestanden door:

code:
1
2
3
4
5
6
7
8
9
10
11
# we stellen de ingegeven max clients in
listen(HANDLE,$aantal);
...
while(true) {
 if(accept(koppeling,HANDLE)) {
 ...
     if (open (AANBOD,$pad."$bestand")) {
       @stuur = <AANBOD>;
       print koppeling "HTTP/1.1 200 OK\r\n\r\n";
       print koppeling @stuur;
       ...


hoe kan ik dit aanpassen zodanig dat ook andere filetypes
ondersteund worden?

Clowns to the left of me, Jokers to the right


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 02:26
write
Dat werkt niet. :)

Volgens mij zou print binary-safe moeten zijn. Wat gaat er precies mis? Misschien moet je je content type goed instellen?

Verwijderd

Dat dit überhaupt werkt is al een wonder aangezien de meeste headers missen, wat dat betreft zou ik eens naar de HTTP specificatie kijken.

Verder lees je een bestand in in een array, met 1 regel per array element, dit gaat met binaire bestanden natuurlijk snel fout. Hier zou ik gewoon met read werken.

  • Juup
  • Registratie: Februari 2000
  • Niet online
Je moet de Content-type specificeren
bv
code:
1
2
3
print koppeling "HTTP/1.1 200 OK\n";
print koppeling "Content-type: image/gif\n\n";
...

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


  • Kapoen
  • Registratie: Mei 2002
  • Laatst online: 22:10
code:
1
print koppeling "Content-type: image/gif\n\n";


moet ik na deze regel dan gewoon het betreffende bestandje doorsturen?
ik heb deze regel geprobeerd maar in mijn browser verschijnt dan gewoon
een ludiek vierkantje met "IMAGE" erin, maar de tekening zelf verschijnt niet...

Clowns to the left of me, Jokers to the right


  • muba
  • Registratie: April 2002
  • Laatst online: 19-10-2013

muba

Prince of Persia!

Kapoen schreef op 18 oktober 2002 @ 16:36:
Ben op dit moment de laatste hand aan het leggen
aan een klein webservertje (schoolopdracht)
Laatste hand? Wat ik zo lees moet je de eerste hand nog leggen aan je kennis van het HTTP. :P

Reporter: Mister Gandhi, what do you think of western civilisation?
Gandhi: I think it would be a good idea


  • Kapoen
  • Registratie: Mei 2002
  • Laatst online: 22:10
kijk: Perl is geen hoofdvak om te beginnen en in mijn opgave stond duidelijk dat ik niet heel die HTTP specificatie moest implementeren... ik weet ook wel dat er zoiets bestaat als RFC

mijn probleem heeft trouwens niets te maken met HTTP zelf maar met Perl!

Clowns to the left of me, Jokers to the right


  • muba
  • Registratie: April 2002
  • Laatst online: 19-10-2013

muba

Prince of Persia!

Neejhoor want je moet toch echt wel een *DEEL* van die http inbouwen als je een webserver wil maken... om maar weer een concreet voobeeld erbij te halen: een autofabrikant moet ook weten hoe je remmen maakt voordat hij een auto kan gaan maken....

Reporter: Mister Gandhi, what do you think of western civilisation?
Gandhi: I think it would be a good idea


  • Kapoen
  • Registratie: Mei 2002
  • Laatst online: 22:10
mijn server werkt reeds (getest met verschillende browsers), dus nu moet ik nog juist weten hoe dat ik binarys kan sturen door die socket

Clowns to the left of me, Jokers to the right


Verwijderd

dat sommige browsers ook werken als je het hele HTTP protocol vern**kt, wil nog niet zeggen binaries dan ook goed lukken.

Mensen proberen je hier te helpen, en jij doet een btje arrogant????

Je kan ook eens telnetten of etherealen naar een webserver om te kijken hoe hij z'n packets doorstuurt, en eens op perldoc.com kijken.

ook vind je misschien op hotscripts.com of vbsource.com wel een mooi perl webservertje waar je eens in kan spieken,

sorry maar ik heb het gevoel dat jij niet erg veel moeite doet om je probleem op te lossen.....

  • muba
  • Registratie: April 2002
  • Laatst online: 19-10-2013

muba

Prince of Persia!

Ik heb idd niets toe te voegen aan Foxboy. Voor al dat "btje arrogant" ben ik het helemaal mee eens. Kijk, we proberen je hier idd te helpen. Op dit forum heerst een 'we geven je een idee/tip, jij lost het zelf maar op, we zijn je werknemers niet'-sfeer. Alleen als het idee complex is dragen we wel eens stukken code aan zodat de OP het een beetje kan begrijpen. Maar je verwacht toch niet serieus dat dat http-protocol voor niets is bedacht? Het is een middel van communicatie tussen je server en de client. En sommige clients kunnen misschien best zonder een deel van de communicatie, dat is dan gewoon knap gemaakt, andere clients houden zich gewoon netjes aan de afspraak.

En weetje, er is zelfs een vuistregel die zegt: 'wees als zender strikt in wat je stuurt, wees als ontvanger niet te strikt in wat je ontvangt'. MET ANDERE WOORDEN: HOUD JE AAN HET HTTP PROTOCOL EN STUUR DIE DELEN VAN HET PROTOCOL MEE DIE NODIG ZIJN/BLIJKEN TE ZIJN. Als wij je dus zeggen dat je met Content-type moet gaan spelen, dan ga je dat uitproberen en als het dan nog niet lukt en we wijzen je erop dat het handig is als je je ff een klein beetje in het HTTP verdiept dat je er dan wel uit kan komen (en JA, er is GENOEG over het HTTP te vinden op het internet), dan moet je dat doen en niet aankomen met "mijn server werkt reeds bla bla bla" want waarom werken die plaatjes dan niet?

*sigh*
Vat het BTW niet helemaal persoonlijk op (wel een beetje :D) maar ben vanavond een beetje pissed of...

Foxboy, wat is 'etherealen' en hoe spreek je het uit?

Reporter: Mister Gandhi, what do you think of western civilisation?
Gandhi: I think it would be a good idea


  • Kapoen
  • Registratie: Mei 2002
  • Laatst online: 22:10
ok mijn reply was over de schreef, daarvoor mijn welgemeende excuses aan iedereen hier die mij heeft willen helpen (meer bepaald foxboy en muba)

maar toch begrijp ik echt niet wat ik fout doe... mijn server werkt echt (voor degenen die graag mijn code eens willen testen: jay@nephilimco.com en ik wil je graag mijn code sturen dan). En ik heb reeds veel gelezen over HTTP (oa de RFC), maar mijn probleem ligt echt bij perl... over binarys doorsturen weet ik niets (Perl is zo'n vak dat bij ons word opgevat als 'zoek het maar zelf ff uit als je nog tijd hebt tussen al die projecten door'), daarom dat ik er zo weinig over weet (en ik ook niet veel tijd heb om me er echt in te verdiepen... C++ en Java en Cobol en... vragen bijna al mijn tijd :/ )

nogmaals mijn excuses aan iedereen die ik hier beledigd heb, ik waardeer jullie hulp echt wel!

Clowns to the left of me, Jokers to the right


  • muba
  • Registratie: April 2002
  • Laatst online: 19-10-2013

muba

Prince of Persia!

Ok... Nou... dan ben ik alweer bereid je op de goede weg te helpen. In elk geval moet een van de eerste dingen die een server verstuurd, de HTTP headers zijn... Dit zijn o.a. de HTTP-versie die de server gebruikt en de Content-type van het file, in dit geval dus image/gif. Na de headers een whitespace maar dat wist je allemaal al neem ik aan. Ehm... Zeg even welke versie van Perl je gebruikt? Als je een Windows versie gebruikt, moet je eerst nog
Perl:
1
binmode STDOUT;
doen. Tenminste ik neem aan dat je gewoon naar STDOUT print. Als je een linux versie gebruikt zou het moeten werken.

Reporter: Mister Gandhi, what do you think of western civilisation?
Gandhi: I think it would be a good idea


  • Kapoen
  • Registratie: Mei 2002
  • Laatst online: 22:10
Ok bedankt, zal het dadelijk eens uittesten

Ik werk zowel onder linux (thuis) als windows (school - ActivePerl pakket), wat mij ook bij een ander 'probleempje' brengt: bij het opstarten van mijn server vraag ik met volgende code het
pad op naar de bestanden die moeten aangeboden worden:
code:
1
2
3
4
print('bron dir?');
print("\n");
$pad=<STDIN>;
chomp ($pad);


Dit werkt onder windows als ik bijvoorbeeld "e:/mijnsite/" invoer; als ik onder linux dan een directory opgeef bv. "/home/kapoen/mijnsite/" dan worden er geen pagina's gevonden/aangeboden door mijn server. Nuja dit is niet echt een probleem, denk eerder dat ik nog wat informatie moet bijtijpen... denk "./home/kapoen/mijnsite/" ofzo, zodanig dat de root directory ook wordt aangeduid.

Clowns to the left of me, Jokers to the right


  • muba
  • Registratie: April 2002
  • Laatst online: 19-10-2013

muba

Prince of Persia!

Nej, want '/' is root, '.' is de huidige dir... dus stel dat de huidige dir is "/home/kapoen/" komt "./home/kapoen" eigenlijk neer op PWD + "./home.kapoen" = "/home/kapoen/home/kapoen" en dat wil je niet. Het is gewoon "/home/kapoen/" maar misschien wil je die laatste slash wel weglaten? Ik weet het niet zeker hoor, maar volgens mij wel.

Reporter: Mister Gandhi, what do you think of western civilisation?
Gandhi: I think it would be a good idea


  • Kapoen
  • Registratie: Mei 2002
  • Laatst online: 22:10
Ok mijn server werkt nu :-)
zo is heb ik het opgelost:
code:
1
2
3
4
5
6
7
8
9
10
11
if (open (AANBOD,$pad."$bestand")) {
   binmode("$bestand");
   @stuur = <AANBOD>;
   print koppeling "HTTP/1.1 200 OK\r\n\r\n";
   #print koppeling "Content-type: image/gif\r\n\r\n";
   print koppeling @stuur;
   open(LOGFILE,">>".$pad."logfile.txt");
   print LOGFILE "Client: GET $bestand\n";
   print LOGFILE "Server: HTTP/1.1 200 OK\n";
   close LOGFILE;
  }


Nuja, deze code moet nog wat bijgeschaafd worden aangezien ik heb gelezen dat die binmode() best vermeden kan worden op het moment dat je met tekst bestandjes gaat
werken. Dit zal ik waarschijnlijk oplossen door de extensie van het opgevraagde bestand
na te gaan en dan zo verder te gaan.

Bedankt voor de hulp mensen!

Clowns to the left of me, Jokers to the right


Verwijderd

MUBA schreef op 19 oktober 2002 @ 18:29:
Foxboy, wat is 'etherealen' en hoe spreek je het uit?
packet sniffen met ethereal (ethereal is het programma spreek uit eetuhriel),
dat houd in dat je de pakettjes onderschept die jouw computer naar de server stuurt en de server weer terugstuurt naar jouw computer. dit is een goede manier om inzicht te krijgen in het http-protocol.
Pagina: 1