62

我的服务器软件在使用绑定errno99: cannot assign requested address以外的 IP 地址时说。127.0.0.1

但如果IP地址是127.0.0.1它的作品。它与命名空间有关吗?

我通过调用在另一个 python 程序中执行我的服务器和客户端代码execfile()。我实际上正在编辑 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()
4

5 回答 5

56

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

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(此视频向您展示如何操作)
  2. 没有其他软件正在侦听端口 6677

还要注意 IP 地址的基本概念:

尝试以下操作,打开开始菜单,在“搜索”字段中输入cmd并按 Enter。一旦黑色控制台打开类型ping www.google.com,这应该会给你和谷歌的 IP 地址。这个地址是谷歌的本地 IP,他们绑定到那个,显然你不能绑定到谷歌拥有的 IP 地址。

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

在此处输入图像描述

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

如果您在学校,则很可能会遇到其他困境和路由器。

于 2013-10-09T09:25:51.613 回答
31

如果您尝试从 Docker 容器内连接到公开的端口,而没有任何服务正在为该端口提供服务,也会出现此错误。

No connection could be made because the target machine actively refused it在没有任何东西侦听/绑定到该端口的主机上,当向未提供服务的本地 URL 发出请求时,您会收到错误消息,例如: 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而不是试图解决它们的原因 - 尽管请告知这是否是一个坏主意。


考虑到我可以找到的所有资源和答案都[Errno 99] Cannot assign requested address指向绑定到占用端口连接到无效 IPsysctl冲突docker 网络问题TIME_WAIT不正确和还有很多东西。因此,我想在这里留下这个答案,尽管不是手头问题的直接答案,因为它可能是这个问题中描述的错误的常见原因。

于 2020-10-13T07:05:34.607 回答
13

试试这样:

server.bind(("0.0.0.0", 6677)) 
于 2018-06-20T14:00:06.067 回答
9

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

你不能绑定10.0.0.1,因为它不属于你,你只能绑定你电脑的ip

您可以绑定0.0.0.0,因为这意味着您计算机上的所有 ip,因此任何 ip 都可以连接到您的服务,如果他们可以连接到您的任何 ip

于 2019-07-26T12:43:21.107 回答
0

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

于 2021-06-10T16:01:26.333 回答