Avatar billede arnebalsby Nybegynder
01. juli 2010 - 23:27 Der er 27 kommentarer

webserver med sockets / C#

Hej hej

Jeg har brug for at lave egen webserver i C#, vha sockets, som kan modtage filer uploaded fra html-sider.

Når jeg har modtaget og læst requestet har jeg en lang byte array, som indeholder hele httprequestet.

Den er selvfølgelig lettere avanceret at forstå og hive filer m.m. ud af.

Findes der ikke nogen klasser som kan hjælpe med til at decifrere httpreqeust.

(jeg kan ikke bruge httplisterner, det skal være med sockets, men jeg kunne godt tænke mig at finde ud af f.eks. hvordan httplisterner løser problemet).

Jeg håber at der er nogen kloge drenge der kan hjælpe mig.

Bedste hilsner

Arne
Avatar billede arne_v Ekspert
01. juli 2010 - 23:40 #1
HttpListener bruger også sockets, så hvorfor er det at du ikke kan bruge HttpListener?
Avatar billede arne_v Ekspert
01. juli 2010 - 23:41 #2
Normale HTTP GET og POST er såre nemme at parse.

En multi part HTTP POST er lidt mere tricky, men sæt et program imellem browser og normalt upload script og se hvad der sendes.

Du kunne muligvis med fordel anvende en MIME parser.

Google finder bl.a.:

http://mimeparser.codeplex.com/
Avatar billede arnebalsby Nybegynder
03. juli 2010 - 13:14 #3
Tak for svar.

Grunden til at vi ikke er så glade for httplistener er at det ikke se ud somom at man kan styre den så meget.

1. Med httplistener kan man da ikke styre f.eks. upload hastigheden (som man kan med sockets) ?

2. Men httplistener kan man da ikke f.eks. måle upload hastiheden (som man kan med sockets) ?

Som jeg forstår httplistener siger man bare beginread, og så vender den tilbage når alt er læst ?

(men jo da, så er det da heller ikke sværer at parse det, vi kigger bare lige lidt efter forskellige muligheder).

Med venlig hilsen
Avatar billede Syska Mester
03. juli 2010 - 14:12 #4
Kommer lidt an på hvordan du styrer hastigheden med Sockets.

Da jeg lige hurtig kiggede på:
http://msdn.microsoft.com/en-us/library/system.net.httplistener.aspx

Så det super nemt ud at gøre med Write til den .... og så bare smide lidt i bufferen hele tiden.

Hvordan gør i nu? Og løsningen med at drosle folk ned i hastighed, er aldrig en god løsning i min verden, da de jo så bare blive ved med at være tilsluttet ... men måske jeg har overset noget.

mvh
Avatar billede arne_v Ekspert
03. juli 2010 - 22:16 #5
listener.GetContext().Request.InputStream indeholder en helt normal Stream on man kan læse fra i det tempo som man nu måtte ønske.

Ved multipart skal man dog stadig selv håndtere MIME parts.
Avatar billede Syska Mester
03. juli 2010 - 22:23 #6
præcis :-)

Så det burde være muligt.
Avatar billede arnebalsby Nybegynder
06. juli 2010 - 15:46 #7
Det lyder godt det må jeg lige kigge på.

Ville man monstro så også kunne læse https (SSL) via denne inputstream... Og få det dekrypteret.
Avatar billede arnebalsby Nybegynder
06. juli 2010 - 15:48 #8
Tak for svar, vi skal kunne styre hastigheden godt både for at skåne server og for ikke at spise hele kraften på klienterne, da de skal kommunikere i andre sockets samtidig.

A
Avatar billede arnebalsby Nybegynder
06. juli 2010 - 15:48 #9
Husk at svar i svar for point.
Avatar billede arnebalsby Nybegynder
06. juli 2010 - 15:53 #10
Hov, jeg tror altså ikke det hjælper noget med
HttpListener.GetContext(). fordi den blocker vel bare til det hele er modtaget.

HttpListener.GetContext(): "This method blocks while waiting for an incoming request. If you want incoming requests to be processed asynchronously (on separate threads) so that your application does not block, use the BeginGetContext method."

Jeg synes nu stadig det ser ud somom at men httplistener henter man det hele på en gang, og kan ikke styre noget.
Avatar billede Syska Mester
06. juli 2010 - 16:01 #11
Du kan vel read i det tempo du vil ...

Hvordan læser du nu ?
Avatar billede arne_v Ekspert
06. juli 2010 - 19:27 #12
Hverken HttpListener eller Socket kan lave HTTPS uden videre.

Et eller andet kode skal jo håndtere server certifikatet!
Avatar billede arne_v Ekspert
06. juli 2010 - 19:27 #13
HttpListener.GetContext()

blokker indtil der kommer et request. Der er ikke noget som forhindrer dig i at starte en tråd med det samme til at processe requesten og gå tilbage og lytte med det samme.
Avatar billede arne_v Ekspert
06. juli 2010 - 19:28 #14
Det kan ikke udelukkes at den context InputStream peger på en allerede hentet fil i et temp dir og ikke på netværks forbindelsen.

Men det kan du da teste !
Avatar billede arnebalsby Nybegynder
07. juli 2010 - 13:01 #15
Jeg tester det om nogen mdr og vender tilbage, skal også se lidt på andre muligheder med httplistener, fordi jeg skal også kunne køre https og det bliver nok en lidt stor mundfuld at kode selv med sockets:).

Har dog allerede kigget en del på forskellige muligheder, og min mavefornemmelse siger mig at man ikke får angang til den bagved liggende socket stream med den der context.inputStream, men blot til en stream lokalt på computeren. (det er vel også det der lidt står i dokumentationen, men who know måske er der alligevel noget at arbejde med).

Tak for svar igen, lig gerne nogen svar.
Avatar billede Syska Mester
07. juli 2010 - 13:24 #16
Den lokale stream er jo reelt også den remote stream om man vil.

Så kan ikke lige følge dig. Du bliver nok nød til at teste noget af det i stedet for at gætte dig frem.

Du kan jo ikke styre hastigheden lokalt for hvor hurtigt clienten sender til dig ... det er klienten som bestemmer det. Men hvad du kan styre er upload til klienten, da det her er dig der bestemmer hastigheden. Selvfølgelig kan der være limitations på linjen, som så automatisk gør at der ikke kan sendes hurtige.

Der findes måder at limit hastighed på, men hvis du har læst om det på nettet, så er der ingen perfekte løsninger mht download fra en klient.
Avatar billede arnebalsby Nybegynder
07. juli 2010 - 14:21 #17
He he, godt at afprøve tingene, men det er nu ikke rigtigt det du skriver. Med sockets er der serveren der styrer tingene, klienten (broseren) sender ikke hvis server holder op med at modtage (ellers ville tingene jo også gå tabt eller skulle hobbes op ude på internettet).
Avatar billede Syska Mester
07. juli 2010 - 15:42 #18
Sockets er bag facaden også en Stream ... gerne ret mig hvis jeg tager fejl.

Du tager fejl, hvis du ved hvordan TCP/IP virker ... at gøre det på din måde ville give delays hele tiden ... og gøre det hele utroligt sløvt.

Men tror jeg vil vente på et svar fra arne_v, han må jo kunne give en af os ret i vores betragninger :-)

Hvis dine overstående betragninger er sande, så er sockets BÆ IMHO. Da det er langsomt.

Men igen ... du er endnu ikke kommet med et eksemple på hvordan du har lavet din download/upload begrænsning med dine sockets.
Avatar billede Syska Mester
07. juli 2010 - 15:46 #19
Og mht til at tingene hobbes op ... der har vi TCP som sørger for at sende igen ... alt efter om den har modtager en ACK/NACK pakke tilbage eller der går rod i det, pga dårlig forbindelse. Der også også packet size og mange andre ting der holder styr på det.

Eventuelt kig på http://en.wikipedia.org/wiki/OSI_model
Avatar billede arnebalsby Nybegynder
07. juli 2010 - 16:04 #20
Jeg tror du blander tcp/ip protokol og sockets lidt sammen her (de pakker du omtaler ligger på tcp/ip nivaue tror jeg).

Med socket siger man ligesom beginreceive, og at den skal modtage f.eks. 8192 bytes, og så kan clienten selvfølgelig frit sende, men klienten sender ikke mere end de 8192 bytes - det gør den først når man laver en nye beginreceive. Det går ikke langsomt, mindste ligeså hurtigt som almindelig web-server.

Vi er på udkig efter andre løsninger af forskellige årsager, bla pga  behov for SSL.
Avatar billede Syska Mester
07. juli 2010 - 16:23 #21
Igen ... der tager du fejl.

Sockets har en buffer som den tager fra når du kalder BeginReceive eller bare Receive og så hvor meget du vil modtage.

Hvordan vil du ellers forklare at den har en Available som angiver hvor mange bytes der er i bufferen uden at man har lavet et kald til BeginReceive/Receive ... Async/Sync kald.

Men i hvert fald, en af os bliver klogere og jeg håber der kommer nogen andre på banen som bakker en af vores teorier op.

mvh
Avatar billede arnebalsby Nybegynder
07. juli 2010 - 21:08 #22
Hey, det er muligt at der er en buffer på en eller anden måde (men det er i så fald ikke en som bliver fyldt uhæmmet op). Fordi jeg har jo allerede lavet det, og det fungerer helt perfekt, jeg kan styre alt med hastigheden og holde pause f.eks. hvert 3. sek.

I chrome kan man se f.eks. se procents uploades stoppe op og starte igen.

Jeg ved det hele kan løses til perfektion med sockets, jeg er igang med at undersøge hvilke andre muligheder der er .
Avatar billede arnebalsby Nybegynder
07. juli 2010 - 21:13 #23
Arne V: httplistener kan så vidt jeg kan se også håndtere SSL, men man skal selvfølgelig give den et certifikat og sådan.
Avatar billede Syska Mester
07. juli 2010 - 21:30 #24
Ja, og det er netop pga TCP/IP og at bufferen i Sockets ikke bliver fyldt mere og at tingene bliver sendt igen. Ergo spilder du en masse båndbredde både hos dig selv og din klient. Tror mig, jeg har læst side op og ned omkring det ...

Nej, det kan ikke løses til perfektion ... det kan løses, men du spilder også båndbredde ved at gøre det, men mindre du kan styre sockets i begge ender.

Hvis du har læst om bandwidth limitation per ip, subnet, dst ip/dst net ovs ... så vil du vide det ikke sådan lige er til ... uden kunstigt at gå ind og rode ... og derved spilde båndbredde :-)

Download fra din server er 100% under din kontrol, og den kan styres uden tab ...

mvh
Avatar billede arnebalsby Nybegynder
08. juli 2010 - 10:13 #25
nu kan jeg se hvad du mener - det er en nye tanke for mig, men det afhænjer nok af hvor store klumper man sætter socket til at modtage af gangen kan jeg forestille mig - det er nu ikke mit indtryk at det er et kæmpe problem.

Spørgsmålet er så om det giver 25% eller 2% overforbrug at man holder pause ?
Avatar billede Syska Mester
08. juli 2010 - 12:08 #26
Ja ... man skal i hvert fald bare være klar over det. Men jeg ville vende den op ... der bliver som sådan jo nok ikke brugt mindre bånddredde fordi man begrænser brugeren ... han bliver bare ved med at upload/download i længere tid.

mvh
Avatar billede arnebalsby Nybegynder
08. juli 2010 - 18:34 #27
Det er bla. fordi applicakatinen har behov for en masse anden kommunikation med server samtidig, som ellers kan blive blokkeret eller langsom. Men nok om det, det virker fint med sockets, og jeg er ved at undersøge andre muligheder.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester