如何在Ruby中正确传入UDP Socket send函数参数?解决类型转换错误
解决UDP套接字send方法的“no implicit conversion to string”错误
错误根源
你的代码中system(command)返回的是布尔值(true表示命令执行成功,false表示失败),但UDPSocket#send方法的第一个参数要求是字符串类型,类型不匹配导致了转换错误。
修正方案
根据你的需求,有两种常见的解决方式:
方案1:返回命令执行的输出结果
如果需要把命令执行的标准输出返回给客户端,不要使用system,改用%x[#{command}]来捕获命令输出:
require 'socket' socket = UDPSocket.new() socket.bind('0.0.0.0',6666) loop do command,sender = socket.recvfrom(24) ip = sender[3] # 捕获命令的标准输出,strip去除多余的换行/空格 resp = %x[#{command.strip}] # 检查命令执行状态,失败时补充提示信息 resp = "Command execution failed" if $?.exitstatus != 0 socket.send(resp, 0, ip.to_s, sender[1]) end
%x[command]会执行命令并返回其标准输出的字符串,完美匹配send的参数要求。$?是Ruby的全局变量,用于获取上一个子进程的退出状态码,据此判断命令是否执行成功。
方案2:仅返回执行成功/失败的状态
如果只需要告知客户端命令是否执行成功,将布尔值转换为字符串即可:
require 'socket' socket = UDPSocket.new() socket.bind('0.0.0.0',6666) loop do command,sender = socket.recvfrom(24) ip = sender[3] success = system(command) # 将布尔状态转换为可读的字符串 resp = success ? "Command executed successfully" : "Command failed" socket.send(resp, 0, ip.to_s, sender[1]) end
内容的提问来源于stack exchange,提问作者user14527579
相关产品推荐
相关产品推荐

