You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python Socket通信报Errno 98地址已占用问题求助

解决Socket Errno 98: Address already in use问题

首先,咱们来拆解一下你遇到的问题:当你用Mininet创建交换机拓扑并尝试用Python Socket代码绑定6633端口时,出现了地址已被占用的错误,这背后主要有两个核心原因,咱们一步步来解决。

核心原因分析

你的Mininet启动命令指定了远程控制器端口为6633:

sudo mn --switch ovsk --topo tree,depth=2,fanout=8 --controller=remote,ip=127.0.0.1,port=6633

而6633是OpenFlow协议的默认控制器端口——如果你的本地已经运行了OpenFlow控制器(比如Ryu、OpenDaylight、ONOS),这个端口早就被控制器进程占用了;就算没运行控制器,Mininet的交换机也会持续尝试连接这个端口,导致端口处于被占用的状态,你的Python服务端自然无法绑定。

另外,如果你之前启动过服务端程序但没有正常释放端口,端口可能会处于TIME_WAIT状态,也会导致绑定失败。

具体解决方案

方案1:避开控制器默认端口,改用其他端口

这是最直接的解决办法,把你的Socket服务端和客户端改用一个未被占用的端口(比如6634):

  • 修改服务端代码的绑定端口:
    s.bind((host, 6634)) # 把6633改成6634
    
  • 修改客户端代码的连接端口:
    s.connect((host, 6634)) # 同步改成6634
    

方案2:如果不需要远程控制器,修改Mininet启动命令

如果你只是想测试Socket通信,不需要OpenFlow控制器,可以让Mininet不连接远程控制器:

sudo mn --switch ovsk --topo tree,depth=2,fanout=8 --controller=none

这样6633端口就不会被占用,你的服务端可以正常绑定这个端口。

方案3:解决端口TIME_WAIT状态的占用(针对服务端重启场景)

如果是服务端程序关闭后重启出现的错误,可能是端口还处于TIME_WAIT状态未释放。可以在服务端代码中同时设置SO_REUSEADDR和SO_REUSEPORT:

import socket
host = socket.gethostbyname("")
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 添加这两行
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1)
s.bind((host, 6633))
s.listen(1)
# 后续代码不变

注意:SO_REUSEPORT需要Python 3.3+以及Linux内核3.9+支持。

额外代码小问题提醒

你的客户端代码还有两个小bug,顺便给你指出来:

  1. 没有导入numpy库,需要在开头添加:import numpy as np
  2. np.random.choice返回的是numpy数组,直接调用encode()会报错,需要先转成字符串,比如:
    # 取数组中的第一个元素并转为字符串
    message = str(np.random.choice(normalized_x[0], 1, replace=False)[0])
    s.send(message.encode())
    

内容的提问来源于stack exchange,提问作者dkssud

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 16:02:48