socket.error:[errno 99]无法在python中分配请求地址和命名空间

mzillmmw  于 2023-08-02  发布在  Python
关注(0)|答案(7)|浏览(93)

我的服务器软件说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()

k0pti3hp

k0pti3hp1#

把事情简化到最基本的东西,这就是你想要测试的:

import socket
server = socket.socket() 
server.bind(("10.0.0.1", 6677)) 
server.listen(4) 
client_socket, client_address = server.accept()
print(client_address, "has connected")
while True:
    recvieved_data = client_socket.recv(1024)
    print(recvieved_data)

字符串
这在假设几件事的情况下有效:
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,这在你的路由器中完成。假设你在一个人后面。
如果你在学校里,有其他的困境和路由器的方式最有可能。

roqulrg3

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镜像 *):

docker run --name serv1 -p 5000:5000 -dit python

字符串
然后,对于[Errno 0] Error,在主机上输入Python控制台,而对于[Errno 99] Cannot assign requested address,通过调用以下命令访问容器上的Python控制台:

docker exec -it -u 0 serv1 python


然后在任一情况下调用:

import urllib.request
urllib.request.urlopen('https://localhost:5000')


最后我将这些错误中的任何一个都视为等同于No connection could be made because the target machine actively refused it,而不是试图修复它们的原因--尽管如果这是一个坏主意,请提供建议。

t30tvxxf

t30tvxxf3#

试试这样:

server.bind(("0.0.0.0", 6677))

字符串

qybjjes1

qybjjes14#

绑定localhost127.0.0.1,意味着您只能 * 从本地连接到您的服务。
不能绑定10.0.0.1,因为不属于你,只能绑定你电脑的ip
您可以绑定0.0.0.0,因为它意味着您计算机上的所有ip,因此任何ip都可以连接到您的服务,如果他们可以连接到您的任何ip

qco9c6ql

qco9c6ql5#

这不是直接回答问题,而是在上述解决方案失败时的调试方向。
当您不在本机环境中时,假设您在VM或WSL上,由于NAT,内部网络可能对外部计算机不透明。因此,请确保您可以从尝试绑定的任何位置ping IP。如果没有,则考虑切换到正确的环境或考虑网络桥接。如果您正在寻找WSL 2特定的解决方案,您可以尝试此链接:Bridging WSL2 network adapter with Windows在Virtual Box中,您可以更改Network Adapter -> Attached To:桥接适配器。另一个需要注意的是,如果你试图绑定到一个端口<1023,你需要管理员权限。

zwghvu4y

zwghvu4y6#

这是我在远程VM上需要的:
第一个月
复制自here

bf1o4zei

bf1o4zei7#

在我的例子中,我在Ubuntu服务器中运行一个容器,而Postgres在我试图连接的localhost中的另一个容器中运行(暴露为-p 5432:5432)。我尝试了所有类型的地址:localhost127.0.0.10.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工作没有问题。希望这能帮助其他人。

相关问题