Socket.error: [errno 99] не может назначить запрошенный адрес и пространство имен в python
В моем серверном программном обеспечении errno99: cannot assign requested address
используется ip-адрес, отличный от 127.0.0.1
для привязки.
Но если IP-адрес 127.0.0.1
, он работает.
Связано ли это с пространствами имен?
Я выполняю код своего сервера и клиента в другой программе python, вызывая execfile()
.
Я фактически редактирую исходный код mininet.I отредактировал 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()
Ответы
Ответ 1
Сбрасывая все на основы, это то, что вы хотели бы протестировать с помощью:
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)
Это предполагает несколько вещей:
- Ваш локальный IP-адрес (на сервере) - 10.0.0.1 (Это видео показывает, как)
- Никакое другое программное обеспечение не прослушивает порт 6677
Также обратите внимание на базовую концепцию IP-адресов:
Попробуйте выполнить следующее, откройте начальное меню в поле типа поиска cmd
и нажмите клавишу ввода.
Как только черная консоль откроет тип ping www.google.com
, это должно дать вам и IP-адрес для Google. Этот адрес является локальным IP-адресом googles, и они привязаны к этому, и вы можете не связываться с IP-адресом, принадлежащим google.
С учетом этого у вас есть собственный набор IP-адресов.
Сначала у вас есть локальный IP-адрес сервера, но тогда у вас есть локальный IP-адрес вашего дома.
На приведенном ниже рисунке 192.168.1.50
- это локальный IP-адрес сервера, к которому вы можете привязать.
У вас все еще есть 83.55.102.40
, но проблема в том, что он принадлежит маршрутизатору, а не вашему серверу. Поэтому даже если вы посетите http://whatsmyip.com и сообщите, что ваш IP-адрес 83.55.102.40
, это не так, потому что он может видеть только, где вы 're come from.. и вы получаете доступ к вашему интернету с маршрутизатора.
![enter image description here]()
Чтобы ваши друзья могли получить доступ к вашему серверу (привязанный к 192.168.1.50
), вам необходимо переслать порт 6677
в 192.168.1.50
, и это делается на вашем маршрутизаторе.
Предполагая, что вы находитесь за одним.
Если вы в школе, скорее всего, столкнулись с другими дилеммами и маршрутизаторами.
Ответ 2
Попробуйте вот так: server.bind(("0.0.0.0", 6677))
Ответ 3
когда вы связываете localhost
или 127.0.0.1
, это означает, что вы можете только подключаться к своему сервису из локальной сети.
вы не можете связать 10.0.0.1
, потому что он не принадлежит вам, вы можете только связать ip, принадлежащий вашему компьютеру
вы можете связать 0.0.0.0
, потому что это означает, что все ip на вашем компьютере, поэтому любой ip может подключиться к вашему сервису, если он может подключиться к любому вашему ip