web-dev-qa-db-ja.com

Pythonで「接続が拒否されました」というエラーが表示されるのはなぜですか? (ソケット)

私はSocketsを初めて使用しますが、私の完全な理解不足を許してください。

サーバースクリプト(server.py)があります。

#!/usr/bin/python

import socket #import the socket module

s = socket.socket() #Create a socket object
Host = socket.gethostname() #Get the local machine name
port = 12397 # Reserve a port for your service
s.bind((Host,port)) #Bind to the port

s.listen(5) #Wait for the client connection
while True:
    c,addr = s.accept() #Establish a connection with the client
    print "Got connection from", addr
    c.send("Thank you for connecting!")
    c.close()

およびクライアントスクリプト(client.py):

#!/usr/bin/python 

import socket #import socket module

s = socket.socket() #create a socket object
Host = '192.168.1.94' #Host i.p
port = 12397 #Reserve a port for your service

s.connect((Host,port))
print s.recv(1024)
s.close

デスクトップターミナルに移動し、次のように入力してスクリプトを開始します。

python server.py

その後、ラップトップ端末に移動してクライアントスクリプトを開始します。

python client.py

しかし、次のエラーが表示されます。

ファイル「client.py」、9行目

s.connect((Host、port))

Methの224行目の「/usr/lib/python2.7/socket.py」ファイル

getattr(self._sock、name)(* args)を返します

socket.error:[Errno 111]接続が拒否されました

別のポート番号を使用してみましたが、役に立ちませんでした。ただし、クライアントスクリプトで同じipとgethostname()メソッドを使用してホスト名を取得でき、デスクトップ(サーバー)にpingを実行できました。

49
Sheldon

の代わりに

Host = socket.gethostname() #Get the local machine name
port = 12397 # Reserve a port for your service
s.bind((Host,port)) #Bind to the port

試してみてください

port = 12397 # Reserve a port for your service
s.bind(('', port)) #Bind to the port

リスニングソケットが制限されすぎないようにします。それ以外の場合、リスニングは1つのインターフェイスでのみ発生し、ローカルネットワークとは関係ありません。

1つの例としては、127.0.0.1のみをリッスンし、別のホストからの接続を不可能にする場合があります。

67
glglgl

このエラーは、何らかの理由でクライアントがサーバースクリプトを実行しているコンピューターのポートに接続できないことを意味します。これは、宛先へのルーティングの不足など、いくつかの原因で発生する可能性がありますが、サーバーにpingを送信できるため、そうではないはずです。もう1つの理由は、クライアントとサーバーの間にファイアウォールがあることです。サーバー自体またはクライアントにある可能性があります。ネットワークのアドレス指定を考えると、サーバーとクライアントの両方が同じLAN上にあると想定しているため、トラフィックをブロックする可能性のあるルーターは関係ないはずです。この場合、次のことを試してみます。

  • サーバーでリッスンしているポートが本当にあるかどうかを確認します(コードが思ったとおりに動作するかどうかがわかります)。ただし、OSによってはnetstat -ntulpのようなことができます。
  • サーバーへの接続を受け入れている場合は、サーバーから確認します。これもOSに基づきますが、telnet LISTENING_IP LISTENING_PORTはジョブを実行する必要があります
  • クライアントからサーバーのポートにアクセスできるかどうかを確認しますが、コードは使用しません。クライアントからtelnet(またはOSに適したコマンド)を使用してください。

そして、調査結果をお知らせください。

8
SpankMe
Host = socket.gethostname()  # Get the local machine name
port = 12397                 # Reserve a port for your service
s.bind((Host,port))          # Bind to the port

このエラーはDNS解決に関連していると思います。この文Host = socket.gethostname()はホスト名を取得しますが、オペレーティングシステムがホスト名をローカルアドレスに解決できない場合、エラーが発生します。 Linuxオペレーティングシステムは、/etc/hostsファイルを変更し、その中に1行追加できます。以下のようになります(「ホスト名」はsocket.gethostname()が取得したものです)。

127.0.0.1   hostname
1
aoniao

S = socket.socket()と仮定すると、サーバーは次の方法でバインドできます。

Host = socket.gethostname()
s.bind((Host, port))

方法2:

Host = socket.gethostbyname("localhost")  #Note the extra letters "by"
s.bind((Host, port))

方法3:

Host = socket.gethostbyname("192.168.1.48")
s.bind((Host, port))

クライアント側でまったく同じメソッドを使用しないと、エラーが発生します:socket.error errno 111 connection refused.

そのため、サーバーで行うのとまったく同じ方法でホストを取得する必要があります。たとえば、クライアントの場合、それに応じて次のメソッドを使用します。

方法1:

Host = socket.gethostname() 
s.connect((Host, port))

方法2:

Host = socket.gethostbyname("localhost") # Get local machine name
s.connect((Host, port))

方法3:

Host = socket.gethostbyname("192.168.1.48") # Get local machine name
s.connect((Host, port))

問題が解決することを願っています。

1
M Shiraz Baig

あなたのserver.pyファイルで:Host = socket.gethostname()の代わりにHost ='192.168.1.94'

0
Majd Saadaoui

ターミナルでこのコマンドを試してください:

Sudo ufw enable
ufw allow 12397
0
mou ayad

接続をpingできましたが、それでも「接続が拒否されました」エラーが表示されました。私は自分自身にpingをしていたことが判明しました!それが問題でした。

0
Azizbro