美文网首页
ruby socket

ruby socket

作者: will2yang | 来源:发表于2018-07-18 22:27 被阅读0次

    创建套接字

    require 'socket'
    socket = Socket.new(Socket::AF_INET, Socket::SOCK_STREAM)
    

    注:ipv4, stream数据流的形式,该功能由TCP提供, 如果是SOCK_DGRAM, 数据报形式则由UDP套接字提供.

    通过symbol作为参数

    require 'socket'
    socket = Socket.new(:INET6, :STREAM)
    
    绑定套接字
    require 'socket'
    socket = Socket.new(:INET, :STREAM)
    
    # 创建一个c结构体保存用于监听的地址
    addr = Socket.pack_sockaddr_in(4481, '0.0.0.0')
    # 绑定
    socket.bind(addr)
    
    绑定不同的地址
    require 'socket'
    # 该套接字将会绑定在环回接口,只侦听来自本地主机的客户端
    local_socket = Socket.new(:INET, :STREAM)
    local_addr = Socket.pack_sockaddr_in(4481, '127.0.0.1')
    local_socket.bind(local_addr)
    
    # 该套接字将会绑定在所有已知的接口,侦听所有向其发送信息的客户端
    any_socket = Socket.new(:INET, :STREAM)
    any_addr = Socket.pack_sockaddr_in(4481, '127.0.0.1')
    local_socket.bind(any_addr)
    # 该套接字试图绑定到一个未知的接口,结果导致Errno::EADDRNOTAVAIL
    error_socket = Socket.new(:INET, :STREAM)
    error_addr = Socket.pack_sockaddr_in(4481, '1.2.3.4')
    error_socket.bind(error_addr)
    
    侦听队列
    require 'socket'
    
    socket = Socket.new(:INET, :STREAM)
    addr = Socket.pack_sockaddr_in(4481, '0.0.0.0')
    socket.bind(addr)
    
    socket.listen(5)
    

    我们给listen方法传递了一个整数类型的参数。这个 数字表示服务器套接字能够容纳的待处理(pending)的最大连接数。 待处理的连接列表被称作侦听队列。

    接受连接

    accept 是阻塞式的,一直阻塞到有连接到达。

    require 'socket'
    server = Socket.new(:INET, :STREAM)
    addr = Socket.pack_sockaddr_in(4481, '0.0.0.0')
    server.bind(addr)
    server.listen(128)
    connection, _ = server.accept
    

    accept返回的信息

    require 'socket'
    
    server = Socket.new(:INET, :STREAM)
    addr = Socket.pack_sockaddr_in(4481, '0.0.0.0')
    server.bind(addr)
    server.listen(128)
    
    connection, _ = server.accept
    
    print 'Connection class: '
    p connection.class
    
    print 'Server fileno:'
    p server.fileno
    
    print 'Connection fileno: '
    p connection.fileno
    
    print 'Local address:'
    p connection.local_address
    
    print 'Remote address:'
    p connection.remote_address
    
    # Connection class: Socket
    # Server fileno: 5
    # Connection fileno: 8
    # Local address: #<Addrinfo: 127.0.0.1:4481 TCP>
    # Remote address: #<Addrinfo: 127.0.0.1:58164 TCP>
    

    accept loop

    require 'socket'
    
    server = Socket.new(:INET, :STREAM)
    addr = Socket.pack_sockaddr_in(4481, '0.0.0.0')
    server.bind(addr)
    server.listen(128)
    
    loop do
      connection, _ = server.accept
      connection.close
    end
    

    关闭服务

    require 'socket'
    
    server = Socket.new(:INET, :STREAM)
    addr = Socket.pack_sockaddr_in(4481, '0.0.0.0')
    server.bind(addr)
    server.listen(128)
    connection, _ = server.accept
    
    connection.close_write
    connection.close_read
    

    close_write 和 close_read 方 法 在 底 层 都 利 用 了 shutdown(2) 。 同 close(2)明显不同的是:即便是存在着连接的副本,shutdown(2)也可 以完全关闭该连接的某一部分.
    close会关闭调用它的套接字实例。如果该套接字在系统中还有其他副 本,那么这些副本不会被关闭,所占用的资源也不会被回收。
    和close不同,shutdown会完全关闭在当前套接字及其副本上的通 信。但是它并不会回收套接字所使用过的资源。每个套接字实例仍必须使用close结束它的生命周期

    shutdown
    require 'socket'
    
    server = Socket.new(:INET, :STREAM)
    addr = Socket.pack_sockaddr_in(4481, '0.0.0.0')
    server.listen(128)
    connection, _ = server.accept
    
    # 创建连接副本。
    copy = connection.dup
    
    # 关闭所有连接副本上的通信
    connection.shutdown
    
    # 关闭原始连接。副本会在垃圾收集器进行收集时关闭。
    connection.close
    
    TCPserver

    简化创建server所需要的代码

    require 'socket'
    
    server = TCPServer.new(4481)
    

    同时返回ipv4 ipv6 两个套接字的连接

    require 'socket'
    
    servers = Socket.tcp_server_sockets(4481)
    
    TCPserver loop
    require 'socket'
    
    server = TCPServer.new(4481)
    
    Socket.accept_loop(server) do |connection|
      connection.close
    end
    

    loop处理多个servers

    require 'socket'
    
    servers = Socket.tcp_server_sockets(4481)
    
    Socket.accept_loop(servers) do |connection|
      connection.close
    end
    

    简化为

    require 'socket'
    Socket.tcp_server_loop(4481) do |connection| # 处理连接。
      connection.close
    end
    

    相关文章

      网友评论

          本文标题:ruby socket

          本文链接:https://www.haomeiwen.com/subject/cqqnpftx.html