2016-09-22 48 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 - ./command | 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 

我沒有看到設置插座的點無阻塞當時間在睡眠中浪費了。

a commenthorse_hair後,我把把服務器中的一個線索:

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

我得到第一個'hello',然後長時間沒有,然後再次'hello',重複。另外,當netcat使用-w 0選項時,我會得到'無效等待時間'。唯一的區別是我的netcat明顯不同於你的,並且我正在運行docker。哦,我的接收循環是在一個線程中。只需在線程中循環並打印「hello」(無需從網絡接收)即可工作,因此似乎不會在運行循環中出現延遲。 –

+0

你使用的是什麼版本的netcat? OS X和Linux上的'nc'都允許我使用'-w 0'。 'ls -hl $(which nc)'的輸出是什麼? –