python - 简单 python 服务器的问题。即使在我(据说)关闭套接字之后,socket.accept() 仍接受 input/favicon.ico

标签 python sockets

我是堆栈溢出和套接字编程的新手。预先感谢您的帮助!

一点背景:我正在尝试实现一个简单的 python 服务器。我正在尝试通过 TCP 连接,并且只是尝试从请求中返回一些已解析的文本(我正在尝试发回文本变量“message”)。

但是,似乎即使在我关闭连接之后,服务器端套接字也会接受一些名为“/favicon.ico”的随机输入,并且我不确定它来自哪里。此循环在返回等待连接的状态之前接受“/favicon.ico”几次。

有人知道这是怎么回事吗? 这是我的代码:

#import socket module
from socket import *
serverSocket = socket(AF_INET, SOCK_STREAM)
#Prepare a sever socket
serverPort = 10016
serverName = '192.168.56.101'
serverSocket.bind((serverName,serverPort))
serverSocket.listen(0)

while True:
    #Establish the connection
    print 'Ready to serve...'
    connectionSocket, addr = serverSocket.accept()

    message = connectionSocket.recv(4096)
    filename = message.split()[1]
    #f = open(filename[1:])
    print filename
    connectionSocket.send(message)
    connectionSocket.close()

    print '\nYou got to this line\n'

-------------------------------------------------------- -----------------

这是我的客户端请求: http://192.xxx.56.101:10016/sophie.JPG (堆栈溢出使我失去了IP)

我的客户端输出,似乎返回正常:

GET /sophie.JPG HTTP/1.1
Host: 192.168.56.101:10016
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:24.0) Gecko/20100101 Firefox/24.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive

-------------------------------------------------------- -----------------

这是我的服务器端输出(打印语句):

name@name-VirtualBox:~/Documents/python_scripts$ python server2.py
Ready to serve...
/sophie.JPG
You got to this line
Ready to serve...
/favicon.ico
You got to this line
Ready to serve...
/favicon.ico
You got to this line
Ready to serve...
/favicon.ico
You got to this line
Ready to serve...

-------------------------------------------------------- --------------------------

我希望输出只是前四行:

Ready to serve...
/sophie.JPG
You got to this line
Ready to serve...

--------

我预计只会返回这四行,因为连接关闭后服务器应该返回到其等待状态。但是,它仍然接受一些名为 /favicon.ico 的输入,并在返回等待状态之前再运行循环几次。

有人知道这里发生了什么吗?

谢谢!

----------------------------------------------------

更新:

好的,所以我添加了您建议的行,我看到浏览器正在发送这些额外的请求,并且它们(根据您的说法)正在排队。

除此之外,我还更改了该行:

serverSocket.listen(0)

serverSocket.listen(1)

然后我的代码按照我想要的方式运行。 (实际上,我现在又试了一次,并没有按预期运行。/favicon.ico请求仍在发送)

我想我对正在发生的事情有几个后续问题:

  1. 为什么浏览器对 /favicon.ico 发出更多请求,而我没有要求它(使用原始代码 serverSocket(0)?

  2. 现在我已经允许服务器监听多个套接字连接,为什么虚假连接请求 (/favicon.ico) 消失了?

谢谢,我也会阅读有关 syn cookie 的内容。

最佳答案

值得庆幸的是,您的服务器正在按预期工作!

尝试在调用serversocket.accept()后将其添加到您的代码中:print addr

发生的事情是这样的:

你开始循环,然后调用accept()。您正在等待新连接到达端口 10016。您接收该连接,提供响应,然后关闭该连接。

然后再次循环 - 从而准备好接受另一个套接字连接。这次是/favicon.ico。

addr 变量告诉您​​每个新的套接字连接(对于 foo.jpg 和 favicon.ico)都发生在不同的端口上 - 这就是accept() 的作用。

由于您的代码一次只能处理一个连接,因此浏览器对 favicon.ico 的请求将进入队列。也就是说,浏览器已请求连接到您的服务器以获取网站图标,但您的服务器尚未接受该连接。

现在,理论上,您不应该接受任何积压的连接。但是有一个问题!事实证明,如果您的内核上启用了 TCP syn cookie,this parameter is ignored 。 (你怎么知道这一点?嗯,我用 C 语言完成了一系列网络工作,这对我很有帮助;Python 抽象了许多这些细节。)

希望有帮助!

关于python - 简单 python 服务器的问题。即使在我(据说)关闭套接字之后,socket.accept() 仍接受 input/favicon.ico,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19559671/

相关文章:

http - 使用 Berkeley Sockets 接收未知大小的数据

Java多线程服务器解释请

sockets - lua nginx 模块中提到的 TCP 套接字是什么?

Python 将 32 位转换为 16 位 tiff

python - 类型错误 : Object of type Decimal is not JSON serializable

python - 使用 Jupyter Notebook 获取 404 GET/contents.js

Java 套接字导致流过早结束

java - Int 大小 字节 套接字 AS3

python - 如何从图像中删除小的独立蒙版?

python selenium无法找到存在的表ID