2016-09-22 12 views
1

プログラムの標準出力をnetcat:nc -u localhost 50000にパイプしています。 UDP 50000上で聴くと、このような何かをするPythonプログラムです:netcat経由でPythonに回線を送信する際の問題

lstsock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 
    lstsock.setblocking(0) 

    while True: 
     print '1' 
     try: 
      tmp = lstsock.recv(SOCK_BUFSZ) 
     except socket.error, e: 
      if e.args[0] == errno.EWOULDBLOCK: 
       sleep(.5) 
       continue 
      else: 
       print("Socket error: {}".format(e)) 
       return 
     print tmp 

私は常にいくつかの行を取得しますが、その後、プログラムはprint '1'にハングアップします。行生成プログラムを実行すると、出力は毎秒約stdinの行になります。何が起きてる?

編集、それは何らかの形で関係しています場合:行を生成プログラムがドッキングウィンドウである(--net="host"で実行、およびサーバー(受諾ライン)のホストで実行ドッキングウィンドウの上にあるドッカーが127.0.0.1経由で送信される

別の編集:SOCK_BUFSZバイトを受け取ったときに入力を受け付けなくなったようですが、バッファをリサイクルしていませんか?

アップデート:これはDockerの問題です。接続性(私はサーバーにpingすることができ、データの最初のバーストが通過します)

+0

私はあなたにnetcatスクリプトを見せてもらえますか? –

+0

@DavidCullen - /コマンド| nc -u localhost 50000 –

答えて

1

このPythonスクリプトは、私の仕事:

import socket 

lstsock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 
lstsock.bind(('127.0.0.1', 50000)) 

SOCK_BUFSZ = 4096 
counter = 1 
while True: 
    print "counter = %s" % counter 
    counter += 1 
    data, addr = lstsock.recvfrom(SOCK_BUFSZ) 
    print data 

私はラインを送信するために、このbashスクリプトを使用:時間だったとき

while true ; 
do 
    echo "Running..." 
    echo -n "hello" | nc -w 0 -u "127.0.0.1" 50000 
    sleep 1 
done 

私はノンブロッキングであることをソケットを設定するポイントを見ていません眠ってしまった。 horse_hairからa comment

、私はスレッドでサーバーを置く置く:

import socket 
import threading 
import time 

SOCK_BUFSZ = 4096 

def udp_server(quit_flag): 
    udp_sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 
    udp_sock.bind(('127.0.0.1', 50000)) 
    counter = 1 
    while not quit_flag.is_set(): 
     print "counter = %s" % counter 
     counter += 1 
     data, addr = udp_sock.recvfrom(SOCK_BUFSZ) 
     print data 

def main(): 
    quit_flag = threading.Event() 
    udp_thread = threading.Thread(target=udp_server, args=(quit_flag,)) 
    udp_thread.daemon = True 
    udp_thread.start() 
    try: 
     while True: 
      time.sleep(1.0) 
    except KeyboardInterrupt: 
     print "Exiting due to keyboard interrupt" 
    quit_flag.set() 
    udp_thread.join() 

if __name__ == '__main__': 
    main() 

すべてはまだ動作します。

+0

私は最初に「こんにちは」を得てから、何もせず、その後もう一度「こんにちは」を繰り返します。また、netcatで-w 0オプションを使用すると、「無効な待ち時間」が発生します。唯一の違いは、私のネットキャットがあなたとは明らかに異なっていることです。私はドッカーを通して走っています。ああ、私の受信ループはスレッドにあります。単にループして(ネットワークから受信せずに)スレッドで 'hello'を印刷すると、実行ループに遅延があるようには見えません。 –

+0

'netcat'のどのバージョンを使用していますか? OS XとLinuxの 'nc'は私に' -w 0'を使用させます。 'ls -hl $(which nc)'の出力は何ですか? –

関連する問題