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

时间:2013-10-08 11:07:45

标签: python sockets namespaces ip

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

5 个答案:

答案 0 :(得分:29)

将事情简化为基础知识这是您想要测试的内容:

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 1==1:
    recvieved_data = client_socket.recv(1024)
    print(recvieved_data)

这可以假设一些事情:

  1. 您的本地IP地址(在服务器上)是10.0.0.1(This video shows you how
  2. 没有其他软件正在侦听端口6677
  3. 还要注意IP地址的基本概念:

    尝试以下操作,打开开始菜单,在“搜索”字段中输入cmd,然后按Enter键。 一旦黑色控制台打开,请键入ping www.google.com,这应该为您提供谷歌的IP地址。这个地址是googles本地IP,它们绑定到那个地址,显然你可以绑定到谷歌拥有的IP地址。

    考虑到这一点,您拥有自己的一组IP地址。 首先你拥有服务器的本地IP,但是你拥有你家的本地IP。 在下图中,192.168.1.50是您可以绑定到的服务器的本地IP。 你仍然拥有83.55.102.40,但问题是它归路由器所有,而不是你的服务器。因此,即使您访问http://whatsmyip.com并且告诉您您的IP是83.55.102.40,但事实并非如此,因为它只能看到您来自哪里...而且您正在访问您的互联网路由器。

    enter image description here

    为了让您的朋友访问您的服务器(绑定到192.168.1.50),您需要将端口6677转发到192.168.1.50,这在您的路由器中完成。 假设你落后于其中一个。

    如果你在学校,最有可能出现其他困境和路由器。

答案 1 :(得分:4)

尝试这样:    server.bind((“” 0.0.0.0“,6677))

答案 2 :(得分:3)

如果没有活动的端口尝试从Docker容器内连接到暴露的端口,该错误也会出现

在没有任何内容监听/绑定到该端口的主机上,当您向未提供服务的本地URL发出请求时,您会得到No connection could be made because the target machine actively refused it错误,例如:localhost:5000。但是,如果启动绑定到该端口的容器,但其中没有运行任何服务器实际为该端口提供服务,则对本地主机上该端口的任何请求都将导致:

  • [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,而不是试图解决它们的原因-尽管请告知这是否是一个坏主意。


考虑到我可以在[Errno 99] Cannot assign requested address点上找到的所有资源和答案都朝着binding to an occupied portconnecting to an invalid IP的方向,我花了整整一天的时间,sysctl conflictsdocker network issuesTIME_WAIT being incorrect等更多内容。因此,尽管这不是当前问题的直接答案,但我想保留此答案,因为这可能是导致该问题中所述错误的常见原因。

答案 3 :(得分:0)

绑定localhost127.0.0.1时,这意味着您只能从本地连接到服务。

您不能绑定10.0.0.1,因为它不属于您,您只能绑定计算机拥有的IP

您可以绑定0.0.0.0,因为这意味着计算机上的所有IP,因此只要它们可以连接到您的任何IP

,任何IP都可以连接到您的服务。

答案 4 :(得分:0)

这不是直接回答问题。但是,如果有人来寻找有关此错误的答案但仍然没有找到解决方案,如果您遇到像我这样的情况,则认为这会有所帮助。 当您不在本机环境中时,假设您在 VM 或 WSL 上,由于 NAT,内部网络可能对外部计算机不透明。因此,请确保您可以从尝试绑定的任何地方 ping 通 IP。如果不是,则考虑切换到正确的环境或考虑网络桥接。 如果您正在寻找 WSL2 特定的解决方案,您可以尝试此链接: Bridging WSL2 network adapter with Windows 在 Virtual Box 中,您可以更改网络适配器 -> 附加到:桥接适配器。 另一个考虑因素是,如果您尝试绑定到端口 <1023,则需要管理员权限。