通过netcat发送行到Python的问题



我正在将程序的标准输出管道传输到netcat: nc -u localhost 50000。监听UDP 50000是一个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'上。当我运行行生成程序时,输出大约每秒生成一行。这是怎么回事?

编辑,如果它有某种关联:程序生产行在docker中(用--net="host"运行),服务器(接受行)在运行docker的主机上。Docker正在通过127.0.0.1发送。

另一个编辑:当接收到SOCK_BUFSZ字节时,它似乎停止接受输入。它不是在回收缓冲?

更新:这似乎是Docker的一个问题。它可以在本地主机上工作,但不能从容器中工作。我有连接(我可以ping服务器,并且第一次数据爆发通过)。

这个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

当时间浪费在睡眠时,我不明白将套接字设置为非阻塞有什么意义。

在来自hor_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()

一切正常

最新更新