Tag: sockets

如何在Ruby上的Unix上创建持久网络套接字?

我希望能够编写一个可以重新启动而不会丢失它的套接字连接的ruby程序。

如何创建持久的TCPSockets?

我有一台服务器连续向客户端发送两条消息: require ‘socket’ require ‘thread’ connections = [] server = TCPServer.new(9998) loop do Thread.start(server.accept) do |client| client.print ‘Once’ client.print ‘Upon a time.’ end #eo Thread end #eo infinte loop 客户是: require ‘socket’ client = TCPSocket.new(‘localhost’, 9998) 2.times { print client.read } client.close 客户端“暂停”,直到我关闭服务器,然后才打印出消息。 我知道将client.close添加到服务器会修复暂停,但我不想关闭套接字。 我知道一些应用程序重用TCPSocket。 因此,它可以是Client > Server , Server > Client , Client > […]

如何使用Rails通过Web套接字发送二进制文件

我有一个Rails应用程序,用户上传音频文件。 我想将它们发送到第三方服务器,我需要使用Web套接字连接到外部服务器,因此,我需要我的Rails应用程序作为websocket客户端。 我正在试图找出如何正确设置它。 我还没有承诺任何gem,但’faye-websocket’gem看起来很有前途。 我甚至在“ 超时之前在websocket中发送大文件 ”中找到了类似的答案,但是,使用该代码对我来说不起作用。 以下是我的代码示例: @message = Array.new EM.run { ws = Faye::WebSocket::Client.new(“wss://example_url.com”) ws.on :open do |event| File.open(‘path/to/audio_file.wav’,’rb’) do |f| ws.send(f.gets) end end ws.on :message do |event| @message << [event.data] end ws.on :close do |event| ws = nil EM.stop end } 当我使用它时,我从收件人服务器收到错误: No JSON object could be decoded 这是有道理的,因为我不相信它为faye-websocket正确格式化。 他们的文件说: send(message)接受字符串或字节大小的数组,并通过连接向另一个对等体发送文本或二进制消息; 二进制数据必须编码为数组。 […]

我如何在Ruby中使用RAW套接字?

我正在尝试使用Ruby创建一个原始套接字。 问题是,那里没有任何称为“原始套接字”的东西,另一方面,Socket类本身并没有完全记录。 有没有人在Ruby中为那种套接字提供一些代码示例,或者可能是某种类型的文档? 顺便说一句,我已经知道如何使用TCPSocket和TCPServer类,我需要的是特别是原始套接字。

如何在Ruby中创建双向SSL套接字

我正在构建一个客户端Ruby库,它连接到服务器并等待数据,但也允许用户通过调用方法来发送数据。 我使用的机制是有一个初始化套接字对的类,如下所示: def initialize @pipe_r, @pipe_w = Socket.pair(:UNIX, :STREAM, 0) end 我允许开发人员调用以向服务器发送数据的方法如下所示: def send(data) @pipe_w.write(data) @pipe_w.flush end 然后我在一个单独的线程中有一个循环,我从连接到服务器的socket和@pipe_r : def socket_loop Thread.new do socket = TCPSocket.new(host, port) loop do ready = IO.select([socket, @pipe_r]) if ready[0].include?(@pipe_r) data_to_send = @pipe_r.read_nonblock(1024) socket.write(data_to_send) end if ready[0].include?(socket) data_received = socket.read_nonblock(1024) h2 << data_received break if socket.nil? || socket.closed? || socket.eof? […]

如何使用RestClient拯救Ruby中的套接字错误?

我正在使用RestClient在ruby类中进行网络调用。 每当我没有连接到互联网时,我都会收到SocketError 。 我添加了一个救援块以捕获exception,但我无法这样做。 错误消息是: SocketError (Failed to open TCP connection to api.something.com:443 (getaddrinfo: Name or service not known)) module MyProject class Client def get_object(url, params={}) response = RestClient.get(url, {params: params}) rescue SocketError => e puts “In Socket errror” rescue => e puts (e.class.inspect) end end end 广泛的救援被调用并打印SocketError ,但为什么以前的rescue SocketError没有被触发! 你看到我遗失的东西吗?

Mac + Ruby:无法访问Socket的ioctl? 怎么修?

一天中的好时光。 Ruby代码: def hw_address(iface) sock = Socket.new(Socket::AF_INET, Socket::SOCK_DGRAM,0) buf = [iface,””].pack(‘a16h16’) sock.ioctl(SIOCGIFHWADDR, buf); sock.close return buf[18..24].to_etheraddr end puts hw_address(‘lo0′) 它做什么:获取接口的mac-address。 按预期在Debian上运行。 但是在Mac OS X上,我得到错误:“ioctl’:套接字不支持操作(Errno :: EOPNOTSUPP) 反正有没有修复/传递此错误消息并在套接字上工作ioctl ?

Rails App中的持久TCP连接

我有一个在服务器上运行的第三方应用程序,它对客户端进行身份validation并回复。 我的问题在于我到rails应用程序的每个请求都需要建立TCP连接并获取数据。 是否可以建立持久连接,以便减少建立连接的开销。

在Ruby中读取套接字时了解IO.select

我有一些代码,我用来从网络套接字获取数据。 它工作正常,但我试图通过反复试验进入它。 我谦卑地承认我不完全理解它是如何工作的,但我真的很想。 (这是我找到的货物forms的工作代码) 我不明白的部分以“ready = IO.select …”开头。我不清楚: IO.select正在做什么(我尝试查找它但更加困惑的是内核和什么不是) IO.select的数组参数是什么 准备好[0]正在做什么 读取1024字节的一般想法? 一次 这是代码: @mysocket = TCPSocket.new(‘192.168.1.1’, 9761) th = Thread.new do while true ready = IO.select([@mysocket]) readable = ready[0] readable.each do |socket| if socket == @mysocket buf = @mysocket.recv_nonblock(1024) if buf.length == 0 puts “The server connection is dead. Exiting.” exit else puts “Received […]

如何在不利用其他IP地址的情况下从Ruby获取我的机器的IP地址?

我到处搜索,但他们的解决方案需要某种forms的IP地址。 以下是我找到的解决方案。 require ‘socket’ #METHOD 1 ip = IPSocket.getaddress(Socket.gethostname) puts ip #METHOD 2 host = Socket.gethostname puts host #METHOD 3(uses Google’s address) ip = UDPSocket.open {|s| s.connect(“64.233.187.99”, 1); s.addr.last} puts ip #METHOD 4(uses gateway address) def local_ip orig, Socket.do_not_reverse_lookup = Socket.do_not_reverse_lookup, true # turn off reverse DNS resolution temporarily UDPSocket.open do |s| s.connect ‘192.168.1.1’, 1 […]