ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

(17)Ruby使用UnixSocket

2021-06-01 19:51:22  阅读:289  来源: 互联网

标签:17 sock Unix UnixSocket 接字 Ruby UNIXServer UNIXSocket


UnixSocket和UnixServer

Ruby提供了特殊的Unix套接字类,在底层你可以访问操作系统.
它可以让你实现客户端和服务器为面向连接和无连接协议的基本套接字支持。

核心:获取在线帮助UNIXSoket.methods (require socket)

=> [:pair, :socketpair, :select, :pipe, :open, :attr, :attr_reader, :attr_writer, :attr_accessor,
:new, :sysopen, :popen, :foreach, :read, :binread, :binwrite, :write, :readlines, :send, ]

使用Ruby完成UnixSocket的数据传输

1) Ruby 提供了UNIXSocket类的 new 方法来创建一个基础的Unix套接字。

使用代码:UNIXSocket.new("/var/run/mysql/mysql.sock") 创建一个不存在的 unix 套接字。
该类方法可以兼顾bind绑定文件能力,而且,文件的实际创建过程由bind功能完成。

2) Ruby 提供了UNIXSocket类的 open 方法来连接一个指定的Unix套接字。

使用代码:UNIXSocket.open("/var/run/mysql/mysql.sock") 连接一个已存在的 unix 套接字。
这类方法返回一个客户端套接字,数据发送将通过连接的套接字文件传递

3) Ruby 提供了UNIXSocket类的 send 方法来向这个的Unix套接字的发送数据

使用代码:UNIXSocket.send('message', flag) 发送数据到指定的unix套接字

4) Ruby 提供了UNIXSocket类的 recv 方法来接收来自这个的Unix套接字的数据

使用代码:UNIXSocket.recv(number) 接收来自指定unix套接字的数据

使用Ruby完成UnixServer的数据传输

a) Ruby 提供了UNIXServer类的 new 方法来创建一个基础的Unix套接字。

使用代码:UNIXServer.new("/var/run/mysql/mysql.sock") 创建一个服务端的 unix 套接字。
这个方法:封装了bind创建相关文件,并listen监听该文件的能力

b) Ruby 提供了UNIXServer类的 open 方法来连接一个存在的Unix套接字。

使用代码:UNIXServer.open("/var/run/mysql/mysql.sock") ,同上一个方法

c) Ruby 提供了UNIXServer类的 accept 方法来接受来自这个的Unix套接字的数据

使用代码:UNIXServer.accept() 无参数,接收来自客户的连接请求。

d) Ruby 提供了UNIXServer类的 close 方法来关闭这个的Unix套接字的连接

使用代码:UNIXServer.close() 关闭连接

代码实例(客户端):

require 'socket'
s = UNIXSocket.new("/tmp/sock")
s.send "hello", 0
UNIXServer.open("/tmp/sock") {|serv|
 UNIXSocket.open("/tmp/sock") {|c|
   s = serv.accept
   s.puts "hi"
   s.close
   p c.read #=> "hi\n"
 }
}

服务端代码:

require 'socket'
serv = UNIXServer.new("/tmp/sock")
begin # emulate blocking accept
 sock = serv.accept_nonblock
rescue IO::WaitReadable, Errno::EINTR
 IO.select([serv])
 retry
end
# sock is an accepted socket.
require 'socket'
include Socket::Constants
socket = Socket.new( AF_INET, SOCK_STREAM, 0 )
sockaddr = Socket.pack_sockaddr_in( 2200, 'localhost' )
socket.bind( sockaddr )

socket.listen( 5 )

标签:17,sock,Unix,UnixSocket,接字,Ruby,UNIXServer,UNIXSocket
来源: https://blog.51cto.com/rulix9527/2842923

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有