【问题标题】:Python server "Only one usage of each socket address is normally permitted"Python服务器“通常只允许每个套接字地址使用一次”
【发布时间】:2012-09-11 03:56:38
【问题描述】:

我正在尝试在 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 中编程。关于如何解决这个问题的任何想法?

【问题讨论】:

  • twisted 这样的高级模块比直接使用套接字更有效率。
  • @PauloScardine:是的,但这是我正在做的一个练习,我需要使用套接字(以了解有关低级内容的更多信息)。
  • @PauloScardine 顺便说一句,我在 Windows 上使用 Twisted 时也遇到了这个错误

标签: python sockets connection webserver


【解决方案1】:

在 Windows 上,您可以尝试以下步骤:

1。检查哪个进程使用该端口。

# 4444 is your port number
netstat -ano|findstr 4444

你会得到这样的东西:

# 19088 is the PID of the process
TCP    0.0.0.0:4444           *:*                                    19088

2。杀死这个进程

与:

tskill 19088

或者:

taskkill /F /PID 19088

祝你好运。

【讨论】:

  • 这应该是最佳答案:错误主要出现在调试期间。
  • 这个答案是我问题的关键。这个答案stackoverflow.com/a/12362623/2759116 也让我领先了一步,但这不是解决这个问题的主要方法。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    在@JohnKugelman 发布的the article 中指出,即使在启用SO_REUSEADDR 之后,您也无法使用套接字连接到与以前相同的远程端:

    SO_REUSADDR 允许您使用卡在 TIME_WAIT 中的端口,但是 您仍然无法使用该端口建立到最后的连接 将其连接到。

    我看到你只是在测试/玩弄。但是,为避免此错误,您确实需要确保正确终止连接。你也可以弄乱操作系统的 tcp 时间:http://www.linuxquestions.org/questions/linux-networking-3/decrease-time_wait-558399/

    出于测试目的,如果您只是以循环方式更改您的serverPort 也可以,您怎么看?

    【讨论】:

      【解决方案4】:

      这可能是因为您没有终止服务器代码并尝试在另一个 cmd 上再次运行它。服务器无法托管在相同的端口号上,请尝试终止以前的托管服务器。

      【讨论】:

        【解决方案5】:

        关闭套接字很重要(特别是在 Windows 上)。否则,您必须在关闭 Python 后等待它超时。

        会:

        try:
            while 1:
                newConnection, client = s.accept()
                msg = newConnection.recv(BUFFER_SIZE)
        
                print msg
        
                newConnection.send("hello world")
                newConnection.close()
        finally:
            s.close()
        

        帮助?

        【讨论】:

          【解决方案6】:

          如果您尝试重新运行服务器而不停止服务器的最后一刻,它将无法正常工作。如果你想停止当前的瞬间去

          shell-->重启shell。

          如果你已经关闭了 shell 停止服务器转到后台处理器中的任务管理器结束任务 python 进程。这将停止服务器的最后一刻。

          【讨论】:

            【解决方案7】:

            我将端口号更改为其他端口号,它可以工作。

            if __name__ == '__main__':
                socketio.run(app, debug = True, use_reloader = False, port=1111)
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2014-01-16
              • 1970-01-01
              • 2014-05-29
              • 1970-01-01
              • 2012-04-06
              • 2023-03-30
              • 2017-07-14
              相关资源
              最近更新 更多