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