socket.error:[errno 99] nu poate atribui adresa și spațiul de nume solicitate în python (Programare, Python, Prize, Spații De Nume, Ip)

user2833462 a intrebat.

Software-ul serverului meu spune errno99: cannot assign requested address în timp ce se utilizează o altă adresă ip decât 127.0.0.1 pentru legare.

Dar dacă adresa IP este 127.0.0.1 funcționează.are legătură cu spațiile de nume?

Execut codurile mele de server și client într-un alt program python, apelând execfile()Am editat net.py și în interiorul acestuia am folosit execfile(‘server.py’) execfile(‘client1.py’) și execfile(‘client2.py’).Astfel, de îndată ce „sudo mn –topo single,3” este apelat împreună cu crearea a 3 gazde, codurile mele de server și client vor fi executate.Am dat codurile mele de server și client mai jos.

#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()

Comentarii

  • Arătați-ne niște coduri, altfel nu vă putem ajuta. (de preferință, cum ați configurat socket-ul și cum executați „serverul” prin apelarea lui execfile() (orice motiv pentru a folosi execfile() btw?)))) – –  > Por Torxed.
  • Ce adresă folosești când încerci altceva decât 127.0.0.0.1? Am reprodus eroarea ta cu legarea la un IP invalid. Nu uitați că un server se poate lega doar pe el însuși, deci IP-ul sau numele pe care îl dați trebuie să fie unul al serverului… –  > Por mguijarr.
  • Când faceți bind(), asociați socket-ul cu o adresă IP locală și un port. Deci, atâta timp cât adresa este locală, inclusiv 127.0.0.1 (adresa localhost), bind ar funcționa. Dar, încercarea de a face bind la o adresă care nu este locală ar duce la eroarea de mai sus. –  > Por Manoj Pandey.
  • @Torxed Am editat întrebarea. vă rog să o parcurgeți. –  > Por user2833462.
  • @user2833462 10.x.x.x, , 172.16.x.x, , 192.168.x.x sau 127.0.0.x sunt rețele locale. Dar asta e trist, 83.127.224.44 este o rețea locală adresă (și este o adresă locală adresă la care doriți să vă legați), deoarece este adresa atribuită computerului dvs. (de exemplu, nu ați putea să bind() la „www.google.com” pentru că nu o dețineți, dar dacă dețineți „www.made-up-example.com” veți putea să vă legați la acea adresă, iar odată ce ați înțeles acest concept de bază, ar trebui să vă legați la adresa „made-up-example.com”. IP și nu la adresa în sine). –  > Por Torxed.
4 răspunsuri
Torxed

Dezbrăcând lucrurile la bază, aceasta este ceea ce ai vrea să testezi:

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)

Acest lucru funcționează presupunând câteva lucruri:

  1. Adresa IP locală (pe server) este 10.0.0.0.1 (Acest videoclip vă arată cum)
  2. Niciun alt software nu ascultă pe portul 6677

Rețineți, de asemenea, conceptul de bază al adreselor IP:

Încercați următoarele, deschideți meniul start, în câmpul „căutare” tastați cmd și apăsați enter.Odată ce se deschide consola neagră, tastați ping www.google.com și acest lucru ar trebui să vă ofere o adresă IP pentru Google. Această adresă este IP-ul local al googles și se leagă la aceasta și, evident, puteți nu să vă legați la o adresă IP deținută de Google.

Având în vedere acest lucru, dețineți propriul set de adrese IP. în primul rând aveți IP-ul local al serverului, dar apoi aveți și IP-ul local al casei dumneavoastră.în imaginea de mai jos 192.168.1.50 este IP-ul local al serverului la care vă puteți lega.Încă dețineți 83.55.102.40 dar problema este că acesta este deținut de router și nu de serverul dvs. Deci, chiar dacă vizitați http://whatsmyip.com și acesta vă spune că IP-ul dvs. este 83.55.102.40 nu este cazul pentru că nu poate vedea decât de unde veniți… iar dumneavoastră accesați internetul de la un router.

Pentru ca prietenii tăi să acceseze serverul tău (care este legat de 192.168.1.50) trebuie să redirecționați portul 6677 la 192.168.1.50 și acest lucru se face în routerul tău.Presupunând că ești în spatele unui router.

Dacă ești la școală sunt alte dileme și routere în cale cel mai probabil.

Comentarii

  • Mulțumesc pentru că ai explicat acest lucru. Cum se schimbă acest lucru dacă folosiți un server cloud. Să zicem de la AWS?  > Por Gabriel Fair.
  • @GabrielFair Nu sunt sigur, deoarece nu folosesc servicii cloud. Întotdeauna folosesc servere self-hosted unde pot controla hardware-ul 🙂 Cea mai simplă soluție ar fi să faci doar server.bind(("", 6677)) în acest caz, pentru că astfel se va lega la toate interfețele disponibile pe portul 6677 – în loc să te limitezi la un IP cunoscut. Știu că AWS schimbă de obicei IP-urile în exterior, dar în interior ar trebui să rămână aceleași. De asemenea, puteți folosi unul dintre acestea: stackoverflow.com/questions/270745/… –  > Por Torxed.
  • Cum să verificați dacă niciun alt software nu ascultă portul selectat? –  > Por Naveen Kumar.
  • @NaveenKumar depinde de sistemul tău de operare. ss -lp | grep 6677 de exemplu. –  > Por Torxed.
  • @Torxed Eu folosesc Ubuntu $ ss -lp | grep 6010 tcp LISTEN 0 128 127.0.0.1:6010 0.0.0.0:* tcp LISTEN 0 128 [::1]:6010 [::]:* –  > Por Naveen Kumar.
WindyYang

Încercați astfel: server.bind((„0.0.0.0.0”, 6677))

pumpkindle

când faceți bind localhost sau 127.0.0.1, , înseamnă că puteți doar să vă conectați la serviciul dvs. din local.

nu puteți face bind 10.0.0.1 deoarece nu vă aparține, puteți doar bind ip-ul deținut de computerul dvs.

puteți face bind 0.0.0.0 deoarece înseamnă toate ip-urile de pe computerul dumneavoastră, astfel încât orice ip se poate conecta la serviciul dumneavoastră dacă poate se poate conecta la oricare dintre IP-urile dvs.

Voy

Va apărea și această eroare dacă încercați să vă conectați la un port expus din interiorul unui container Docker, atunci când nimic nu deservește în mod activ portul respectiv..

Pe o gazdă în care nimic nu ascultă/se leagă la acel port, veți primi o eroare de No connection could be made because the target machine actively refused it atunci când se face o cerere către un URL local care nu este servit, de exemplu: localhost:5000. Cu toate acestea, dacă porniți un container care se leagă la port, dar nu există un server care să ruleze în interiorul acestuia și care să deservească portul, orice cerere către acel port pe localhost va avea ca rezultat:

  • [Errno 99] Cannot assign requested address (dacă este apelat din interiorul containerului), sau
  • [Errno 0] Error (dacă este apelat din afara containerului).

Puteți reproduce această eroare și comportamentul descris mai sus după cum urmează:

Porniți un container fictiv (notă: acesta va extrage imaginea python dacă nu se găsește la nivel local):

docker run --name serv1 -p 5000:5000 -dit python

Apoi, pentru [Errno 0] Error introduceți o consolă Python pe gazdă, în timp ce pentru [Errno 99] Cannot assign requested address accesați o consolă Python pe container prin apelarea:

docker exec -it -u 0 serv1 python

Și apoi, în ambele cazuri, apelați:

import urllib.request
urllib.request.urlopen('https://localhost:5000')

Am concluzionat cu tratarea oricăreia dintre aceste erori ca fiind echivalentă cu No connection could be made because the target machine actively refused it mai degrabă decât să încerc să remediez cauza lor – deși vă rog să mă sfătuiți dacă aceasta este o idee proastă.


Am petrecut mai mult de o zi încercând să rezolv acest lucru, având în vedere că toate resursele și răspunsurile pe care le-am putut găsi pe site-ul [Errno 99] Cannot assign requested address indică în direcția legarea la un port ocupat, , conectându-se la un IP invalid, sysctl conflicte, probleme de rețea docker, , TIME_WAIT fiind incorecte și multe alte lucruri. Prin urmare, am vrut să las acest răspuns aici, în ciuda faptului că nu este un răspuns direct la întrebarea în cauză, având în vedere că poate fi o cauză comună pentru eroarea descrisă în această întrebare.

Comentarii

  • Bună săpătură! Vă mulțumim! Se întâmplă în continuare în 2020 –  > Por Zaar Hai.