我的服务器软件说errno99: cannot assign requested address
,而使用的ip地址以外的127.0.0.1
绑定。
但如果IP地址是127.0.0.1
,则可以使用。是否与名称空间相关?
我正在通过调用execfile()
在另一个python程序中执行我的服务器和客户端代码。我实际上是在编辑mininet的源代码。我编辑了net.py,在里面我使用了execfile('server.py')、execfile('client1.py')和execfile('client2.py')。所以,只要“sudo mn --topo single,3”被调用,沿着创建了3个主机,我的服务器和客户端代码就会被执行。我已经在下面给出了我的服务器和客户端代码。
#server code
import select
import socket
import sys
backlog = 5
size = 1024
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(("10.0.0.1",9999))
server.listen(backlog)
input = [server]
running = 1
while running:
inputready,outputready,exceptready = select.select(input,[],[])
for s in inputready:
if s == server:
client, address = server.accept()
input.append(client)
else:
l = s.recv(1024)
sys.stdout.write(l)
server.close()
字符串
#client code
import socket
import select
import sys
import time
while(1) :
s,addr=server1.accept()
data=int(s.recv(4))
s = socket.socket()
s.connect(("10.0.0.1",9999))
while (1):
f=open ("hello1.txt", "rb")
l = f.read(1024)
s.send(l)
l = f.read(1024)
time.sleep(5)
s.close()
型
7条答案
按热度按时间k0pti3hp1#
把事情简化到最基本的东西,这就是你想要测试的:
字符串
这在假设几件事的情况下有效:
1.您的本地IP地址(在服务器上)是10.0.0.1(此视频将向您展示如何操作)
1.没有其他软件正在侦听端口6677
还要注意IP地址的基本概念:
尝试以下操作,打开开始菜单,在“搜索”字段中输入
cmd
并按回车键。一旦黑色控制台打开类型ping www.google.com
,这应该给予你和谷歌的IP地址。这个地址是谷歌的本地IP,他们绑定到,显然你可以不绑定到谷歌拥有的IP地址。考虑到这一点,您拥有自己的IP地址集。首先你有服务器的本地IP,然后你有你家的本地IP。下图中
192.168.1.50
是您可以绑定的服务器的本地IP。您仍然拥有83.55.102.40
,但问题是它属于路由器,而不是您的服务器。因此,即使您访问http://whatsmyip.com并告诉您您的IP是83.55.102.40
,但情况并非如此,因为它只能看到您来自哪里。你是通过路由器上网的的数据
为了让你的朋友访问你的服务器(绑定到
192.168.1.50
),你需要将端口6677
转发到192.168.1.50
,这在你的路由器中完成。假设你在一个人后面。如果你在学校里,有其他的困境和路由器的方式最有可能。
roqulrg32#
如果您尝试从Docker容器内连接到暴露的端口,当没有任何东西正在为该端口提供服务时,也会出现此错误**。
在一个没有任何东西监听/绑定到该端口的主机上,当向一个没有服务的本地URL发出请求时,你会得到一个
No connection could be made because the target machine actively refused it
错误,例如:localhost:5000
。但是,如果您启动一个绑定到该端口的容器,但其中没有运行服务器实际为该端口提供服务,则对localhost上该端口的任何请求都将导致:[Errno 99] Cannot assign requested address
(如果从容器中调用),或者[Errno 0] Error
(如果从容器外部调用)。您可以重现此错误和上述行为,如下所示:
启动虚拟容器(* 注:如果在本地找不到,这将拉取python镜像 *):
字符串
然后,对于
[Errno 0] Error
,在主机上输入Python控制台,而对于[Errno 99] Cannot assign requested address
,通过调用以下命令访问容器上的Python控制台:型
然后在任一情况下调用:
型
最后我将这些错误中的任何一个都视为等同于
No connection could be made because the target machine actively refused it
,而不是试图修复它们的原因--尽管如果这是一个坏主意,请提供建议。[Errno 99] Cannot assign requested address
上找到的所有资源和答案都指向binding to an occupied port,connecting to an invalid IP,sysctl
conflicts,docker network issues,TIME_WAIT
being incorrect以及更多的东西。因此,我想把这个答案留在这里,尽管它不是对手头问题的直接回答,因为它可能是这个问题中描述的错误的常见原因。t30tvxxf3#
试试这样:
字符串
qybjjes14#
绑定
localhost
或127.0.0.1
,意味着您只能 * 从本地连接到您的服务。不能绑定
10.0.0.1
,因为不属于你,只能绑定你电脑的ip您可以绑定
0.0.0.0
,因为它意味着您计算机上的所有ip,因此任何ip都可以连接到您的服务,如果他们可以连接到您的任何ipqco9c6ql5#
这不是直接回答问题,而是在上述解决方案失败时的调试方向。
当您不在本机环境中时,假设您在VM或WSL上,由于NAT,内部网络可能对外部计算机不透明。因此,请确保您可以从尝试绑定的任何位置ping IP。如果没有,则考虑切换到正确的环境或考虑网络桥接。如果您正在寻找WSL 2特定的解决方案,您可以尝试此链接:Bridging WSL2 network adapter with Windows在Virtual Box中,您可以更改Network Adapter -> Attached To:桥接适配器。另一个需要注意的是,如果你试图绑定到一个端口<1023,你需要管理员权限。
zwghvu4y6#
这是我在远程VM上需要的:
第一个月
复制自here
bf1o4zei7#
在我的例子中,我在Ubuntu服务器中运行一个容器,而Postgres在我试图连接的localhost中的另一个容器中运行(暴露为-p 5432:5432)。我尝试了所有类型的地址:
localhost
127.0.0.1
0.0.0.0
用于连接字符串postgresql://user:password@localhost:5432/db
,但它们返回超时错误或在localhost的情况下:Io(Os { code: 99, kind: AddrNotAvailable, message: "Cannot assign requested address" })
个非常令人沮丧,因为它在本地工作,我真的不想弄乱Docker网络配置。幸运的是,我记得很久以前修复了类似的bug(如果不是同一个),在Linux中,我只需要用Docker机器IP替换localhost。
172.17.0.1
工作没有问题。希望这能帮助其他人。