Ruby:您可以发送套接字作为参数吗?

时间:2013-09-17 23:32:37

标签: ruby sockets

我在机器上运行了一个很长的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

1 个答案:

答案 0 :(得分:1)

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

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

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