【问题标题】:Weird Errno 48 Address already in use behaviour python奇怪的 Errno 48 地址已经在使用行为 python
【发布时间】:2016-02-06 11:44:10
【问题描述】:

我目前正在尝试了解 Python 中的套接字,并且我正在使用以下代码接收通过 TCP 从热点网络上的智能手机传输的数据。

import socket
import logging

# Logging routine
logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)

# Create a TCP/IP socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# Bind the socket to the port
server_address = ('localhost', 5000)
logger.info('starting up on %s port %s' % server_address)
sock.bind(server_address)

# Listen for incoming connections
sock.listen(1)

# Wait for a connection
logger.info('waiting for a connection')
connection, client_address = sock.accept()

try:
    logger.info('connection from', client_address)

    while True:
        data = connection.recv(16)

        if data:
            print 'Do stuff here'
        else:
            print 'no more data from', client_address
            break

finally:
    # Clean up the connection
    connection.close()

我第一次运行代码时一切正常。运行脚本并想再次运行后,出现以下错误:[Errno 48] Address already in use?。但是,如果我在程序崩溃后再次运行该脚本,则一切正常。我已经检查并确认它以 connection.close() 的 finally 语句结束。看来我总是要运行两次程序才能连续运行两次。

【问题讨论】:

  • 每次运行后,在 shell 提示符下执行此命令:netstat -an | egrep :5000。让我们知道它说了什么。
  • @Rob 提供的命令不产生输出。
  • 我的要求是在每次运行后运行该命令。您描述的测试运行您的命令三次。在您描述的三个运行中的哪一个之后,该命令没有产生任何输出?

标签: python sockets tcp connection errno


【解决方案1】:

这是因为之前的执行让socket处于TIME_WAIT状态,不能立即重用。

为了防止这种情况,设置socket.SO_REUSEADDR:

改变

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR, 1)

【讨论】:

  • 感谢您的回复。但不幸的是也没有工作。我运行一次脚本。第二次我得到错误。如果我再次运行它运行没有问题。它没有解决。
  • 错误是什么?是socket.error: [Errno 98] Address already in use 吗?
  • 否定,同样的错误:[Errno 48] Address already in use
  • 因为你之前运行过脚本,很有可能这个进程仍然绑定到端口(5000)。我认为您需要终止绑定到端口的进程,然后重新运行脚本。检查这个,stackoverflow.com/questions/19071512/…
  • 嗯,好吧,这是有道理的。有没有机会在脚本末尾以编程方式制作?
猜你喜欢
  • 2013-10-04
  • 1970-01-01
  • 1970-01-01
  • 2018-12-20
  • 1970-01-01
  • 1970-01-01
  • 2011-05-26
  • 1970-01-01
相关资源
最近更新 更多