繁体   English   中英

通过 netcat 向 Python 发送行的问题

[英]Issues with sending lines over netcat to 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' 当我运行行生成程序时,大约每秒输出一行到标准输入。 这里发生了什么?

编辑,以防它以某种方式相关:程序生成行在--net="host" (使用--net="host"运行,服务器(接受行)在运行--net="host"--net="host"通过 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

当时间浪费在睡眠中时,我没有看到将套接字设置为非阻塞的意义。

Horse_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()

一切仍然有效。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM