我的服务器软件在使用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()
答案 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)
这可以假设一些事情:
尝试以下操作,打开开始菜单,在“搜索”字段中输入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
,但事实并非如此,因为它只能看到您来自哪里...而且您正在访问您的互联网路由器。
为了让您的朋友访问您的服务器(绑定到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 port,connecting to an invalid IP的方向,我花了整整一天的时间,sysctl
conflicts,docker network issues,TIME_WAIT
being incorrect等更多内容。因此,尽管这不是当前问题的直接答案,但我想保留此答案,因为这可能是导致该问题中所述错误的常见原因。
答案 3 :(得分:0)
绑定localhost
或127.0.0.1
时,这意味着您只能仅从本地连接到服务。
您不能绑定10.0.0.1
,因为它不属于您,您只能绑定计算机拥有的IP
您可以绑定0.0.0.0
,因为这意味着计算机上的所有IP,因此只要它们可以连接到您的任何IP
答案 4 :(得分:0)
这不是直接回答问题。但是,如果有人来寻找有关此错误的答案但仍然没有找到解决方案,如果您遇到像我这样的情况,则认为这会有所帮助。 当您不在本机环境中时,假设您在 VM 或 WSL 上,由于 NAT,内部网络可能对外部计算机不透明。因此,请确保您可以从尝试绑定的任何地方 ping 通 IP。如果不是,则考虑切换到正确的环境或考虑网络桥接。 如果您正在寻找 WSL2 特定的解决方案,您可以尝试此链接: Bridging WSL2 network adapter with Windows 在 Virtual Box 中,您可以更改网络适配器 -> 附加到:桥接适配器。 另一个考虑因素是,如果您尝试绑定到端口 <1023,则需要管理员权限。