1

我在机器上运行了一个很长的 ruby​​ 脚本,我想通过将其划分为小函数并将套接字作为参数发送来重新组织它:

#!/usr/bin/env ruby
def prepare data, my_socket
  # some calculations 
  my_socket.write data
end

# execution starts here 

tcpsocket = TCPSocket.open host, port
data = "xxx"
prepare(data, tcpsocket)

不幸的是我无法测试。

编辑:既然我明白我不应该这样做(我稍后会阅读这个主题),这就是我所做的:

#!/usr/bin/env ruby
def prepare data
  my_array = []
  # some calculations 
  my_array << data
end

# execution starts here 

tcpsocket = TCPSocket.open host, port
data = "xxx"
my_array = prepare data
my_array.each do |m|
  my_socket.write m
end
4

1 回答 1

1

tcpsocket是给定套接字端点的本地标识符(文件描述符)。

通过将一个主机的文件描述符发送到另一台主机,您将无法实现任何目标。如果没有托管文件描述符的内核(或进程),tcpsocket则没有任何意义。通常,内核将具有文件描述符和套接字结构的映射。如果您将tcpsocket文件描述符发送到另一端,则另一端将没有相应的套接字结构。

因此,对传递的文件描述符的操作将因文件描述符错误而失败。在最坏的情况下,如果远程主机上的进程有另一个具有相同值的文件描述符,那么这将导致意想不到的事情!

于 2013-09-17T23:37:35.000 回答