5

Python でクライアントを作成する必要がある TCP サーバーがあります。

サーバーはarduino_uipライブラリを使用する arduino です。サーバー コードは、そのライブラリの TCP サーバーの例と (ほぼ) 同じです。nc をクライアントとして使用すると正常に動作します。

しかし、(この回答のように)Pythonソケットを使用してサーバーと通信すると、サーバーはソケットのシャットダウンまたはクローズでハングします。

これはサーバーの問題である可能性があります。ただし、nc はクライアントとして正常に動作しているため、私の質問は次のとおりです。

この回答は、接続のシャットダウン/クローズ時にサーバーがハングすることを説明する可能性のある nc とは何が異なりますか?

機能するものと機能しないものをまとめる:

  • python クライアント & サーバーとしての nc -l: 動作します
  • クライアントおよびarduinoサーバーとしてのnc:動作
  • Python クライアントと arduino サーバー: サーバーがハングする

クライアントコードは次のとおりです。

import socket

def netcat(hostname, port, content):
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect((hostname, port))
    s.sendall(content)
    s.shutdown(socket.SHUT_WR)
    while 1:
        data = s.recv(1024)
        if data == "":
            break
        print "Received:", repr(data)
    print "Connection closed."
    s.close()

編集 :

それは実際にはタイミングの問題であるようです (Vorsprung の回答で考えさせられました!)。上記のコードでシャットダウンの前にスリープ(0.5)を追加すると、すべてうまく機能します(Ctrl + Cを押す前に手動の遅延があるnetcatのように)。そのarduinoライブラリを今すぐチェックする必要があると思います...

4

2 に答える 2

2

netcat ソース ( svn checkout svn://svn.code.sf.net/p/netcat/code/trunk netcat-code ) を見て、セットアップ直後ではなく、閉じる直前に shutdown() を呼び出すだけですソケット

私が見た限りではその差です

于 2013-11-06T19:16:48.227 に答える