5

ネットワーク経由でラズベリーパイに接続しようとしています。私はraspiのサーバーとしてpythonを実行しています。以下は、Web から取得した単純なサーバー コードです。

import socket

serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = socket.gethostname()
port = 80
print (host)
print (port)
serversocket.bind((host, port))

serversocket.listen(5)
print ('server started and listening')
while 1:
    (clientsocket, address) = serversocket.accept()
    print ("connection found!")
    data = clientsocket.recv(1024).decode()
    print (data)
    clientsocket.send("data is sent".encode())

クライアント コードをテストします。

import socket

s = socket.socket()
host = "192.168.1.247"
port = 80
s.connect((host,port))
s.send('randomData'.encode())
data = ''
data = s.recv(1024).decode()
print (data)
s.close

他のコンピューターでテストしましたが、これらは正常に動作します。raspi がクライアントで、他のコンピューターがサーバーの場合、正常に動作します。しかし、raspi がサーバーで、他のコンピューターがクライアントの場合、常に同じエラーが発生します。「ターゲット マシンがアクティブに拒否したため、接続できませんでした」

C# を使用して接続しようとしています:

TcpClient client = new TcpClient("192.168.1.247", 80)

エラーをスローします:"No connection could be made because the target machine actively refused it"

注: クライアントとしての -raspi からサーバーとしての raspi は正常に動作します。- いくつかの調査を行ったところ、これの最も一般的な原因はファイアウォールまたはルーターの不良であると思われます。--ルーターのせいではないと思いますが、他のコンピューターにうまくアクセスできます。-- Raspbian の「wheezy」Debian ディストリビューションを使用していますが、ファイアウォールが付属しているとは思いません。

どんな助けでも大歓迎です。ありがとう!

4

1 に答える 1

4

socket.gethostname()問題は、IPではなくホスト名を返すものを使用していることだと思います。おそらくこれは、ソケットがそのホスト名にバインドされるがIPにはバインドされないことを意味します。これは、Pythonがhostnameおそらく次の接続のみをリッスンすることを意味します:raspberrypi

ほとんどの場合、マシンはそのホスト名を認識していないため、代わりにこれを使用します。

socket.gethostbyname(socket.gethostname())

ドキュメントにも記載されています

覚えておくべきことは、ホスト名とIPは同じものではないということです。ただし、次のように、ホスト名を/ etc/hostsファイルにあるIPにバインドできます。

192.168.1.247 raspberrypi

于 2013-01-06T12:23:55.933 に答える