当前位置: 首页 > 面试题库 >

Python服务器“每个套接字地址通常只允许使用一种”

公冶经纶
2023-03-14
问题内容

我正在尝试用python创建一个非常基本的服务器,该服务器侦听端口,在客户端尝试连接时创建TCP连接,接收数据,发回一些东西,然后再次侦听(并无限地重复该过程)。这是我到目前为止所拥有的:

from socket import *

serverName = "localhost"
serverPort = 4444
BUFFER_SIZE = 1024

s = socket(AF_INET, SOCK_STREAM)
s.bind((serverName, serverPort))
s.listen(1)

print "Server is ready to receive data..."

while 1:
        newConnection, client = s.accept()
        msg = newConnection.recv(BUFFER_SIZE)

        print msg

        newConnection.send("hello world")
        newConnection.close()

有时,这似乎工作得很好(如果我将浏览器指向“ localhost:4444”,则服务器将打印出HTTP GET请求,而网页将显示文本“ hello
world”)。但是当我在最后几分钟关闭服务器后尝试启动服务器时,偶尔会收到以下错误消息:

Traceback (most recent call last):
  File "path\server.py", line 8, in <module>
    s.bind((serverName, serverPort))
  File "C:\Python27\lib\socket.py", line 224, in meth
    return getattr(self._sock,name)(*args)
error: [Errno 10048] Only one usage of each socket address (protocol/network address/port) is normally permitted

我正在使用Windows 7在python中进行编程。有关如何解决此问题的任何想法?


问题答案:

调用bind()之前,启用SO_REUSEADDR套接字选项。这允许地址/端口立即重用,而不是将其停留在TIME_WAIT状态几分钟,以等待延迟的数据包到达。

s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)


 类似资料:
  • 问题内容: 我正在尝试调整我的简单套接字服务器,使其可以通过多线程具有多个TCP连接,但是我似乎无法使其正常工作。到目前为止,我的代码如下,我不太确定从这里可以去哪里: 谁能为我提供一些有关如何执行此操作的指示,以及为什么我当前的实现无法正常工作?我在这里浏览了Java教程http://download.oracle.com/javase/tutorial/networking/sockets/e

  • null 我正在使用TcpReceivingChannelAdapter和TcpSendingMessageHandler与TcpNetClientConnectionFactory协作。 和IntegrationFlow来动态生成这些连接。 如何为TcpNetClientConnectionFactory创建多个都指向同一主机和端口的套接字?

  • 问题内容: 错误2002(HY000):无法通过套接字’/var/run/mysqld/mysqld.sock’(2)连接到本地MySQL服务器 我尝试了在互联网上找到的所有内容,但是无法解决在Ubuntu 11.04上出现的问题。 我尝试了这些事情: 使用手动启动mysqld 使用启动mysqld 检查它是否正在使用并获得结果 在手动创建文件 授予用户权限 试图删除并重新安装,但仍然无法正常工作

  • > 当同一主机上的两个进程使用网络套接字通信时,它们的套接字必须使用不同的端口吗? 我想是的,因为套接字由IP地址和端口号标识。如果进程的套接字使用相同的端口,则无法区分它们的套接字,对吗? 但是一个主机可以有多个网络接口,所以有多个IP地址。同一个主机上的多个网络接口是否可以共享一个端口,从而使两个套接字共享同一个端口? 例如,SSH本地端口转发由以下选项指定: 然后本地主机(SSH客户端运行的

  • 这就是我有点困惑的地方。 我在服务器端拿到的地址,有客户端连接的WiFi网络的公有地址(这是我预期的),还有一些端口号,基于我对NATs的理解,应该和客户端实际使用的端口号不一样,是用来翻译地址的。 但是,如果我在客户端上使用了getsockname()函数,则得到的端口号与服务器给出的端口号相同。