gpt4 book ai didi

Python和Ruby套接字程序接收数据时出错

转载 作者:太空宇宙 更新时间:2023-11-03 14:47:36 24 4
gpt4 key购买 nike

我正在编写一个程序,其中一个脚本(python 脚本)托管服务器,然后 ruby​​ 脚本连接,这样做后,python 脚本显示提示并将数据发送到连接的 ruby​​ 客户端 ruby程序然后通过系统函数执行命令,我的错误是该命令仅在您结束服务器上的连接(python脚本)时执行,所以我只能发送一个命令,然后结束连接,然后执行ruby脚本,我想要它在收到命令时运行并执行命令。以下是脚本:

python :

#!/usr/bin/env python
import socket
import time
sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
sock.bind(('192.168.1.104',567))
sock.listen(1)
(client,(ip,port))=sock.accept()
print('[*] Connection from {} via port {}').format(ip,port)
while True:
cmd = raw_input("# ")
client.send(str(cmd))

ruby :

class C
attr_accessor :clr
end
r = C.new
r.clr = "\033[0;31m"
d = C.new
d.clr = "\033[0;00m"
require 'socket'
def sock_setup(address,port)
@addr = address
@port = port.to_i
@socket = TCPSocket.open(@addr,port)
while TRUE
@cmd = @socket.read(1024)
puts @cmd
system(@cmd)
end
end
print("Address=> ")
@host = $stdin.gets.chomp
print("\n")
print("Port=> ")
@port_ = $stdin.gets.chomp
sock_setup(@host,@port_)

最佳答案

我不是 Ruby 专家,但是 read(size) 在许多语言中都是以阻塞方式实现的,即只有在读取 size 字节后才会返回,或者连接已关闭 (EOF)。正在查看the documentation Ruby 中似乎是一样的:

Note that this method behaves like fread() function in C. This means it retry to invoke read(2) system call to read data with the specified length (or until EOF). This behavior is preserved even if ios is non-blocking mode.

这意味着在您的情况下它将等待它获取 1024 字节或连接关闭。鉴于您发送的命令可能小于 1024 字节,因此它只会在连接关闭时执行该命令。

如果您不喜欢这种行为,同一文档还建议您应该使用什么:

If you need the behavior like single read(2) system call, consider readpartial, #read_nonblock and sysread.

请注意,我们无法保证您一次发送的所有数据都会在单个 sysread 或类似的操作中被对等方收到。这在仅发送少量数据时可能有效,但在发送大量数据时可能会失败,在这种情况下,您实际上可能需要多个 sysread 来读取所有数据。而且,由于 TCP 是流式传输协议(protocol),因此没有隐式消息边界,因此您必须设计应用程序协议(protocol)来正确标记消息的结尾,以防发送方在接收方有机会完全读取消息之前发送另一条消息。第一个。

关于Python和Ruby套接字程序接收数据时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46134042/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com