» »

[C][linux] socket HTTP

[C][linux] socket HTTP

boss-tech ::

delam neko vajo kjer moram s spletne strani dobit vse podatke, izpisat pa vse razen glave.

v program dobit hosta in port. naredil sem nekako takole:


int socket1=socket(PF_INET, SOCK_STREAM, 0);


send(socket1,"GET / HTTP/1.1 \n\r\n\r",23,0);


n=read(socket1,buffer,100);

while(n>0) {
n=read(socket1,buffer,100);
write(1,buffer,n);}


izpiše mi:
html bodyRequested page cannot be found. Please contact firewall administrator./body /html
buffer: ator./body /html

Ima kdo kako idejo?
  • spremenilo: CCfly ()

BigWhale ::

To moras narediti v Cju ali si si sam izbral c?

Ce slednje, potem pozabi na to! :)

boss-tech ::

v Cju je treba. samo stvar se dela v linux sistemu, tako da je zihr mogoče...

Gundolf ::

Sej lahko pogooglaš za kakšen tutorial na temo (pravzaprav dve temi: socketi v linuxu in pa http transactions), se da (preverjeno) najti. Sicer pa prva stvar, ki me zmoti tule je:
"GET / HTTP/1.1 \n\r\n\r"
Rahlo dvomim, da morajo biti tule \n\r zaporedja, pa še ime strani, ki jo zahtevaš mi manjka tule (res da govorim totalno iz glave, tako da lahko sem se kje uštel).

Quikee ::

Definitivno ne "\n\r\n\r".. verjetno "\r\n\r\n".

Kaj pa pravi: "GET /index.html HTTP/1.1 \r\n\r\n" oz. direktno file, ki ziher obstaja.

Quikee ::

Probaj z headerjem: "GET / HTTP/1.0\r\n\r\n"

Naslednja koda spisana na hitro v pythonu mi dela, medtem ko z headerjem "GET / HTTP/1.1\r\n\r\n" mi ne dela (bad request)
#!/usr/bin/python
import socket
import sys 

host = sys.argv[1]
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((host, 80))
s.send('GET / HTTP/1.0\r\n\r\n')
data = s.recv(1024)
s.close()
print data

boss-tech ::

./httpxxx www.vreme-si.com 80
Connection: close
Content-Type: text/html; charset=iso-8859-1

DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"
htmlhead
title>400 Bad Request/title>
/head>body>
h1>Bad Request/h1>
p>Your browser sent a request that this server could not understand.br />
/p>
hr>
address>Apache Server at www.popcom.si Port 80/address>
/body>/html>

izpis(buffer):

buffer: rver at www.popcom.si Port 80address>
/body>/html>
nderstand.

/p>
hr>


host: www.vreme-si.com

send(socket1,"GET /vreme-danes.htm HTTP/1.1 \r\n\r\n",38,0);

Gundolf ::

BTW, tvoja zahteva je dolga 34 znakov (35, če šteješ 0 na koncu, in ne 38)

b ::

HTTP/1.1 mora imeti Host: header. Ker ga pri tebi nima, ti javi error 400.

Torej:

GET / HTTP/1.1
Host: www.example.com[2x CRLF]

ali pa

GET / HTTP/1.0[2x CRLF]

kjer bos verjetno (odvisno od web serverja) dobil nazaj index default virtualhosta.

Namesto CRLF je cisto v redu tudi samo LF (\n).

boss-tech ::

ja kam pa dam zdaj ta host v: send(socket1,"GET /vreme-danes.htm HTTP/1.1 \r\n\r\n",38,0);

Zgodovina sprememb…

b ::

O madona.... kaj pa če bi ti sam mal možgančke nakravžljal? Ne vem v čem je fora, da se ti vse prinese na pladnju, če delaš neko vajo... Če že nisi bil sposoben poiskat HTTP specifikacije, jo vsaj uporabit poskusi sam.


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Fix skripte: nginx log + group by user-agent + count + sort desc

Oddelek: Programiranje
5728 (651) Invictus
»

Nenavaden črv napada Linksysove usmerjevalnike

Oddelek: Novice / Varnost
227097 (3778) Daniel
»

Postavitev strežnika in lokalnega omrežja

Oddelek: Omrežja in internet
81772 (1489) NoName
»

Netcat + shranjevanje slike

Oddelek: Programska oprema
181855 (1635) someone1
»

[Java]Brane spletne strani preko https

Oddelek: Programiranje
112148 (1967) CWIZO

Več podobnih tem