[英]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.