0

最近、休暇から戻ってきましたが、基本的な python 2 ソケット サーバーが LAN 経由でクライアントと通信できなくなりました。サーバーは Mac 上にあり、クライアントはラズベリー パイまたは Windows 7 マシンです。ここでは、例を示すためにサーバーとクライアントのコードを簡略化しました。

サーバ

import socket
from thread import *

HOST = socket.gethostname()

print HOST

PORT = input ("Enter the PORT number (1 - 10,000)")



s = socket.socket(socket.AF_INET, socket.SOCK_STREAM )
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
print "Socket Created"


s.bind((HOST, PORT))

print "Socket Bind Complete"

s.listen(10)
print "Socket now listening"


    #Sending message to connected client
    #This only takes strings (words


while True:
    #Wait to accept a connection - blocking call
    connection, addr = s.accept()
    print "Connection Established!"

    connection.send("Welcome to the server. Type something and hit enter\n")

    #loop so that function does not terminate and the thread does not end
    while True:

        #Receiving from client
        data = connection.recv(1024)
        if not data:
            break
        connection.sendall(data)
        print data
    connection.close()
s.close()

クライアント

import socket #for sockets
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print "Socket Created"

#Get host and port info to connect
host = raw_input("HOST >>>   ")
port = 2468
s.connect((host, port))


while True:   
    #Send some data to the remote server
    message = raw_input(">>>  ")

    #set the whole string
    s.sendall(message)


    reply = s.recv(1024)
    print reply

質問

ここで何が起こっているのですか?ローカル IP を取得していますが、スクリプトがまだ通信できません。それはOSの問題でしょうか?


より詳しい情報

  1. ping を実行中

    を。Mac ターミナルから PI に ping を実行できました。

    PING raspberrypi (67.63.55.3): 56 data bytes
    64 bytes from 67.63.55.3: icmp_seq=0 ttl=240 time=17.434 ms
    64 bytes from 67.63.55.3: icmp_seq=1 ttl=240 time=18.180 ms
    64 bytes from 67.63.55.3: icmp_seq=2 ttl=240 time=22.046 ms
    64 bytes from 67.63.55.3: icmp_seq=3 ttl=240 time=25.124 ms
    64 bytes from 67.63.55.3: icmp_seq=4 ttl=240 time=31.773 ms
    

    b. 私の PI は Mac をホストとして見つけることができませんでした。これを改善するために何ができるか見ていきます。

    c. 私のPCは私のMacにPINGできました。Mac は PC に ping を実行できました

  2. ファイアウォール

Mac のファイアウォールがオフになっています。[Raspberry Pi Stackexchange サイト] で、PI にファイアウォールがあるかどうかを確認します。

Windowsマシンをテストしたら、さらに情報を追加します

4

2 に答える 2

0

あなたのコードは正常に動作しますが、いくつかのマイナーな修正を行い、コード内のコメントで説明しました:

サーバ:

import socket
from thread import *

# 1.Gets the local ip/ip over LAN.
HOST =socket.gethostbyname(socket.gethostname()) 

print HOST

# 2.Use port no. above 1800 so it does not interfere with ports already in use.
PORT =input ("Enter the PORT number (1 - 10,000)") 

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM )
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
print "Socket Created"
s.bind((HOST, PORT))
print "Socket Bind Complete"
s.listen(10)
print "Socket now listening"
while True:
    connection, addr = s.accept()
    print "Connection Established!"
    connection.send("Welcome to the server. Type something and hit enter\n")
    while True:
        data = connection.recv(1024)
        if not data:
            break
        connection.sendall(data)
        print data
        connection.close()
s.close()

クライアント:

import socket 
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print "Socket Created"
host = raw_input("HOST >>>   ")

# 3. Use the same port no. entered on server.py as the client binds to the 
#    same port
port = input ("Enter the PORT number (1 - 10,000)") 
s.connect((host, port))

while True:   
    message = raw_input(">>>  ")    
    s.sendall(message)
    reply = s.recv(1024)
    print reply

上記のコードは私にとってはうまくいきました。同じ問題を経験したので、あなたにとってもうまくいくと確信しています。見つかったバグは、コード内のコメントに入れました。見てください。

乾杯 ....!

于 2013-09-23T11:42:24.810 に答える
0

両方のスクリプトをローカルで実行すると、私のマシンに接続して通信することができます。ネットワークの問題に直面していますが、これは簡単にデバッグできるはずです。

  1. 間違ったバインディング。 サーバーで、取得した HOST を出力します。サーバーに複数の IP がある場合、間違った IP にバインドしようとする可能性があります。また、「0.0.0.0」(サーバー側のみ) に変更して、それが機能するかどうかを確認することもできます。

  2. ファイアウォール。 いずれかの側が OS レベルで tcp 通信をブロックしている可能性があります。デバッグは、Windows ではWiresharkを介して、UNIXではtcpdumpを介して行われます。スニフを開​​始し、コードを実行して、何が問題なのかを確認してください。ほとんどの場合、クライアントはSYNパケットを送信しますが、サーバーはパケットの応答に失敗しますSYN|ACK。パケットがサーバーに到達した場合はSYN、サーバーのファイアウォールを完全にシャットダウンしてから、もう一度試してください。そうでない場合、クライアントは発信通信を禁止されているため (可能性は低い)、ファイアウォールをシャットダウンする必要があります。

  3. 使用中のポート。 デバッグのために SO_REUSEADDR を削除して、何かが変わるかどうかを確認してください。

  4. 例外。 ソケットからの例外を無視しないようにしてください。

于 2013-03-25T08:27:40.000 に答える