From the other posts on stack overflow this should be working
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(("www.cnn.com" , 80))
s.sendall("GET / HTTP/1.1\r\n")
print s.recv(4096)
s.close
but for some reason it just hangs (at recv
) and never prints. I know that a request to www.cnn.com will chunk it's data but I should at least read something from recv
, right?
p.s. I know this isn't the best way to do it and that there are library like
httplib
andurllib2
out there, but I can't use those for this project (it's for school). I have to use thesocket
library
答案 0 :(得分:12)
You forgot to send a blank line after your request line:
s.sendall("GET / HTTP/1.1\r\n\r\n")
Furthermore, HTTP 1.1 specifies you should add the Host
header field as documented in the Host section in the HTTP 1.1 RFC.
s.sendall("GET / HTTP/1.1\r\nHost: www.cnn.com\r\n\r\n")
答案 1 :(得分:5)
Your code is almost right, but you need to send 2 \r\n
sequences to satisfy the HTTP protocol.
A valid GET request will look like this (note 2 lines):
GET / HTTP/1.1
So your code should be:
s.sendall('GET / HTTP/1.1\r\n\r\n')
Further to that, there are additional headers required for valid HTTP 1.1 requests, such as Host:
. You need to add them to your request, something like this:
s.sendall('''GET / HTTP/1.1
Host: cnn.com
''')
答案 2 :(得分:4)
Sorry to waste everyone's time. I just found this solution here on Stack Overflow (just took some rewording in my Google search to find)
import socket
request = b"GET / HTTP/1.1\nHost: www.cnn.com\n\n"
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(("cnn.com", 80))
s.send(request)
result = s.recv(10000)
while (len(result) > 0):
print(result)
result = s.recv(10000)
And all of the answers were right as well about the ending \r\n\r\n
however those returned 301
statuses. This solution seems to follow the redirect somehow? Anyways, this solutions worked for me
答案 3 :(得分:1)
Try replace this line:
s.sendall("GET / HTTP/1.1\r\n")
with:
s.sendall("GET / HTTP/1.1\r\n\r\n")
^^^^
Also, I think you need replace s.close
with s.close()
since it's a function.
答案 4 :(得分:1)
我正在整理Python 3的示例。我们需要字节/字符串转换,我们还可以使用with
使用自动关闭连接:
#!/usr/bin/env python3
import socket
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.connect(("example.com" , 80))
s.sendall(b"GET / HTTP/1.1\r\nHost: example.com\r\nAccept: text/html\r\n\r\n")
print(str(s.recv(4096), 'utf-8'))
答案 5 :(得分:0)
@james:您在那里进行了一次SlowLoris攻击,却没有意识到。 https://www.youtube.com/watch?v=XiFkyR35v2Y我在这里无法解释得更好 我以为您从以上所有答案中都找到了解决方案,但是我只是想将其告知您。 :)