web-dev-qa-db-ja.com

socket.error:[errno 99]はpythonで要求されたアドレスと名前空間を割り当てることができません

サーバーソフトウェアは、errno99: cannot assign requested address以外のIPアドレスをバインドに使用しているときに127.0.0.1と表示します。

ただし、IPアドレスが127.0.0.1の場合は機能します。名前空間に関連していますか?

execfile()を呼び出して、別のpythonプログラムでサーバーとクライアントのコードを実行しています。実際にミニネットのソースコードを編集しています。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()
24
user2833462

物事を基本に落とし込んで、これはあなたがテストしたいものです:

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)

これは、いくつかのことを前提として機能します。

  1. (サーバー上の)ローカルIPアドレスは10.0.0.1です( このビデオではその方法を示しています
  2. 他のソフトウェアはポート6677でリッスンしていません

IPアドレスの基本概念にも注意してください。

以下を試して、スタートメニューを開き、「検索」フィールドにcmdと入力してEnterキーを押します。黒いコンソールが開いたら、ping www.google.comと入力すると、GoogleのIPアドレスが表示されます。このアドレスはグーグルのローカルIPであり、それらはそれにバインドし、明らかにグーグルが所有するIPアドレスにnotバインドできます。

それを念頭に置いて、独自のIPアドレスのセットを所有します。最初にサーバーのローカルIPを取得しますが、次に自宅のローカルIPを取得します。以下の図の192.168.1.50は、バインドできるサーバーのローカルIPです。まだ83.55.102.40を所有していますが、問題はサーバーではなくルーターが所有していることです。 http://whatsmyip.com にアクセスしても、あなたのIPは83.55.102.40であることがわかります。これは、あなたがどこから来たのかしか見ることができないため、そうではありません。ルーターからインターネットにアクセスしています。

enter image description here

友達があなたのサーバー(192.168.1.50にバインドされている)にアクセスするには、ポート6677192.168.1.50に転送する必要があります。これはルーターで行われます。背後にいると仮定します。

学校にいる場合は、他のジレンマとルーターがあります。

29
Torxed

このようにしてみてください:server.bind(( "0.0.0.0"、6677))

4
WindyYang

localhostまたは127.0.0.1をバインドすると、ローカルからサービスにのみ接続できることを意味します。

10.0.0.1をバインドすることはできません。これは自分のものではないであるため、コンピューターが所有するIPをバインドする

0.0.0.0をバインドできるのは、コンピューター上のすべてのIPを意味するためです。したがって、可能な場合はすべてのIPがサービスに接続できますIPのいずれかに接続

0
pumpkindle