ionian 0.5.0 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1 +1 @@
1
- var search_data = {"index":{"searchIndex":["ionian","extension","io","socket","socket","<<()","closed?()","cmd()","cork()","cork=()","cork?()","expression()","expression=()","extended()","extended()","flush()","has_data?()","has_data?()","initialize_ionian()","initialize_ionian_socket()","ip_add_membership()","ip_drop_membership()","ip_multicast_if()","ip_multicast_if=()","ip_multicast_loop()","ip_multicast_loop=()","ip_multicast_loop?()","ip_multicast_ttl()","ip_multicast_ttl=()","ipv6_add_membership()","ipv6_drop_membership()","ipv6_multicast_hops()","ipv6_multicast_hops=()","ipv6_multicast_if()","ipv6_multicast_if=()","ipv6_multicast_loop()","ipv6_multicast_loop=()","ipv6_multicast_loop?()","multicast()","multicast?()","new()","no_delay()","no_delay=()","no_delay?()","on_match()","persistent?()","protocol?()","purge()","puts()","read_match()","recork()","register_observer()","reuse_addr()","reuse_addr=()","reuse_addr?()","run_match()","ttl()","ttl=()","ttl?()","unregister_observer()","write()"],"longSearchIndex":["ionian","ionian::extension","ionian::extension::io","ionian::extension::socket","ionian::socket","ionian::socket#<<()","ionian::socket#closed?()","ionian::socket#cmd()","ionian::extension::socket#cork()","ionian::extension::socket#cork=()","ionian::extension::socket#cork?()","ionian::extension::io#expression()","ionian::extension::io#expression=()","ionian::extension::io::extended()","ionian::extension::socket::extended()","ionian::socket#flush()","ionian::extension::io#has_data?()","ionian::socket#has_data?()","ionian::extension::io#initialize_ionian()","ionian::extension::socket#initialize_ionian_socket()","ionian::extension::socket#ip_add_membership()","ionian::extension::socket#ip_drop_membership()","ionian::extension::socket#ip_multicast_if()","ionian::extension::socket#ip_multicast_if=()","ionian::extension::socket#ip_multicast_loop()","ionian::extension::socket#ip_multicast_loop=()","ionian::extension::socket#ip_multicast_loop?()","ionian::extension::socket#ip_multicast_ttl()","ionian::extension::socket#ip_multicast_ttl=()","ionian::extension::socket#ipv6_add_membership()","ionian::extension::socket#ipv6_drop_membership()","ionian::extension::socket#ipv6_multicast_hops()","ionian::extension::socket#ipv6_multicast_hops=()","ionian::extension::socket#ipv6_multicast_if()","ionian::extension::socket#ipv6_multicast_if=()","ionian::extension::socket#ipv6_multicast_loop()","ionian::extension::socket#ipv6_multicast_loop=()","ionian::extension::socket#ipv6_multicast_loop?()","ionian::extension::socket#multicast()","ionian::extension::socket#multicast?()","ionian::socket::new()","ionian::extension::socket#no_delay()","ionian::extension::socket#no_delay=()","ionian::extension::socket#no_delay?()","ionian::extension::io#on_match()","ionian::socket#persistent?()","ionian::socket#protocol?()","ionian::extension::io#purge()","ionian::socket#puts()","ionian::extension::io#read_match()","ionian::extension::socket#recork()","ionian::extension::io#register_observer()","ionian::extension::socket#reuse_addr()","ionian::extension::socket#reuse_addr=()","ionian::extension::socket#reuse_addr?()","ionian::extension::io#run_match()","ionian::extension::socket#ttl()","ionian::extension::socket#ttl=()","ionian::extension::socket#ttl?()","ionian::extension::io#unregister_observer()","ionian::socket#write()"],"info":[["Ionian","","Ionian.html","","<p>A library to simplify interaction with IO streams. This includes network\nsockets, file sockets, and serial …\n"],["Ionian::Extension","","Ionian/Extension.html","","<p>A collection of mixins.\n"],["Ionian::Extension::IO","","Ionian/Extension/IO.html","","<p>A mixin for IO objects that allows regular expression matching and\nconvenient notification of received …\n"],["Ionian::Extension::Socket","","Ionian/Extension/Socket.html","","<p>A mixin for Socket objects.\n<p>This module was designed to be extended by instantiated objects that\nimplement …\n"],["Ionian::Socket","","Ionian/Socket.html","","<p>A convenient wrapper for TCP, UDP, and Unix sockets.\n"],["<<","Ionian::Socket","Ionian/Socket.html#method-i-3C-3C","(string)",""],["closed?","Ionian::Socket","Ionian/Socket.html#method-i-closed-3F","()","<p>Returns true if the socket is closed.\n"],["cmd","Ionian::Socket","Ionian/Socket.html#method-i-cmd","(string, **kwargs, &block)","<p>Send a command (data) to the socket. Returns an array of received matches.\nBlock yields received match. …\n"],["cork","Ionian::Extension::Socket","Ionian/Extension/Socket.html#method-i-cork","()","<p>Returns true if multiple writes are buffered into a single segment. See\n#recork. Linux only. ( TCP_CORK …\n"],["cork=","Ionian::Extension::Socket","Ionian/Extension/Socket.html#method-i-cork-3D","(value)","<p>Buffers multiple writes into a single segment if true. The segment is sent\nonce the cork flag is disabled, …\n"],["cork?","Ionian::Extension::Socket","Ionian/Extension/Socket.html#method-i-cork-3F","()",""],["expression","Ionian::Extension::IO","Ionian/Extension/IO.html#method-i-expression","()","<p>Returns the regular expression used for #read_match.\n"],["expression=","Ionian::Extension::IO","Ionian/Extension/IO.html#method-i-expression-3D","(exp)","<p>Set the expression to match against the read buffer. Can be a regular\nexpression specifying capture groups, …\n"],["extended","Ionian::Extension::IO","Ionian/Extension/IO.html#method-c-extended","(obj)","<p>Called automaticallly when the object is extended with #extend.\n"],["extended","Ionian::Extension::Socket","Ionian/Extension/Socket.html#method-c-extended","(obj)","<p>Called automaticallly when the object is extended with #extend.\n"],["flush","Ionian::Socket","Ionian/Socket.html#method-i-flush","()","<p>Flushes buffered data to the operating system. This method has no effect on\nnon-persistent sockets.\n"],["has_data?","Ionian::Extension::IO","Ionian/Extension/IO.html#method-i-has_data-3F","(timeout: 0)","<p>Returns true if there is data in the receive buffer. Args:\n\n<pre>Timeout: Number of seconds to wait for data ...</pre>\n"],["has_data?","Ionian::Socket","Ionian/Socket.html#method-i-has_data-3F","(**kwargs)","<p>Returns true if there is data in the receive buffer. Args:\n\n<pre>Timeout: Number of seconds to wait for data ...</pre>\n"],["initialize_ionian","Ionian::Extension::IO","Ionian/Extension/IO.html#method-i-initialize_ionian","()","<p>Initialize the Ionian instance variables. This is called automatically if\n#extend is called on an object. …\n"],["initialize_ionian_socket","Ionian::Extension::Socket","Ionian/Extension/Socket.html#method-i-initialize_ionian_socket","()","<p>Initialize the Ionian Socket variables. This is called automatically if\n#extend is called on an object. …\n"],["ip_add_membership","Ionian::Extension::Socket","Ionian/Extension/Socket.html#method-i-ip_add_membership","(address = nil, interface = nil)","<p>Join a multicast group. Address is the class D multicast address (uses\nremote address if not specified). …\n"],["ip_drop_membership","Ionian::Extension::Socket","Ionian/Extension/Socket.html#method-i-ip_drop_membership","(address = nil, interface = nil)","<p>Leave a multicast group. Address is the class D multicast address (uses\nremote address if not specified). …\n"],["ip_multicast_if","Ionian::Extension::Socket","Ionian/Extension/Socket.html#method-i-ip_multicast_if","()","<p>Returns the default interface for outgoing multicasts. ( IP_MULTICAST_IF )\n"],["ip_multicast_if=","Ionian::Extension::Socket","Ionian/Extension/Socket.html#method-i-ip_multicast_if-3D","(interface = nil)","<p>Specify default interface for outgoing multicasts. ( IP_MULTICAST_IF )\n"],["ip_multicast_loop","Ionian::Extension::Socket","Ionian/Extension/Socket.html#method-i-ip_multicast_loop","()","<p>Returns true if loopback of outgoing multicasts is enabled. (\nIP_MULTICAST_LOOP )\n"],["ip_multicast_loop=","Ionian::Extension::Socket","Ionian/Extension/Socket.html#method-i-ip_multicast_loop-3D","(value)","<p>Enables loopback of outgoing multicasts if true. ( IP_MULTICAST_LOOP )\n"],["ip_multicast_loop?","Ionian::Extension::Socket","Ionian/Extension/Socket.html#method-i-ip_multicast_loop-3F","()",""],["ip_multicast_ttl","Ionian::Extension::Socket","Ionian/Extension/Socket.html#method-i-ip_multicast_ttl","()","<p>Returns the time to live (hop limit) for outgoing multicasts. (\nIP_MULTICAST_TTL )\n"],["ip_multicast_ttl=","Ionian::Extension::Socket","Ionian/Extension/Socket.html#method-i-ip_multicast_ttl-3D","(value)","<p>Set the time to live (hop limit) for outgoing multicasts. (\nIP_MULTICAST_TTL )\n"],["ipv6_add_membership","Ionian::Extension::Socket","Ionian/Extension/Socket.html#method-i-ipv6_add_membership","()",""],["ipv6_drop_membership","Ionian::Extension::Socket","Ionian/Extension/Socket.html#method-i-ipv6_drop_membership","()",""],["ipv6_multicast_hops","Ionian::Extension::Socket","Ionian/Extension/Socket.html#method-i-ipv6_multicast_hops","()",""],["ipv6_multicast_hops=","Ionian::Extension::Socket","Ionian/Extension/Socket.html#method-i-ipv6_multicast_hops-3D","(value)",""],["ipv6_multicast_if","Ionian::Extension::Socket","Ionian/Extension/Socket.html#method-i-ipv6_multicast_if","()",""],["ipv6_multicast_if=","Ionian::Extension::Socket","Ionian/Extension/Socket.html#method-i-ipv6_multicast_if-3D","(value)",""],["ipv6_multicast_loop","Ionian::Extension::Socket","Ionian/Extension/Socket.html#method-i-ipv6_multicast_loop","()",""],["ipv6_multicast_loop=","Ionian::Extension::Socket","Ionian/Extension/Socket.html#method-i-ipv6_multicast_loop-3D","(value)",""],["ipv6_multicast_loop?","Ionian::Extension::Socket","Ionian/Extension/Socket.html#method-i-ipv6_multicast_loop-3F","()",""],["multicast","Ionian::Extension::Socket","Ionian/Extension/Socket.html#method-i-multicast","(address)","<p>Returns true if the given address is within the multicast range.\n"],["multicast?","Ionian::Extension::Socket","Ionian/Extension/Socket.html#method-i-multicast-3F","(address)",""],["new","Ionian::Socket","Ionian/Socket.html#method-c-new","(**kwargs)","<p>Args:\n\n<pre>host: IP or hostname to connect to.\nport: Connection&#39;s port number. Default is 23. Unused ...</pre>\n"],["no_delay","Ionian::Extension::Socket","Ionian/Extension/Socket.html#method-i-no_delay","()","<p>Returns true if the Nagle algorithm is disabled. ( TCP_NODELAY )\n"],["no_delay=","Ionian::Extension::Socket","Ionian/Extension/Socket.html#method-i-no_delay-3D","(value)","<p>Disables the Nagle algorithm if true. ( TCP_NODELAY )\n"],["no_delay?","Ionian::Extension::Socket","Ionian/Extension/Socket.html#method-i-no_delay-3F","()",""],["on_match","Ionian::Extension::IO","Ionian/Extension/IO.html#method-i-on_match","(&block)",""],["persistent?","Ionian::Socket","Ionian/Socket.html#method-i-persistent-3F","()","<p>Returns true if the socket remains open after writing data.\n"],["protocol?","Ionian::Socket","Ionian/Socket.html#method-i-protocol-3F","()","<p>Returns a symbol of the type of protocol this socket uses: :tcp, :udp,\n:unix\n"],["purge","Ionian::Extension::IO","Ionian/Extension/IO.html#method-i-purge","()","<p>Erase the data in the IO and Ionian buffers. This is typically handled\nautomatically.\n"],["puts","Ionian::Socket","Ionian/Socket.html#method-i-puts","(*string)","<p>Writes the given string(s) to the socket and appends a newline character to\nany string not already ending …\n"],["read_match","Ionian::Extension::IO","Ionian/Extension/IO.html#method-i-read_match","(**kwargs, &block)","<p>Read matched data from the buffer. This method SHOULD NOT be used if\n#run_match is used.\n<p>Passes matches …\n"],["recork","Ionian::Extension::Socket","Ionian/Extension/Socket.html#method-i-recork","()","<p>Unsets cork to transmit data, then reapplies cork. ( TCP_CORK )\n"],["register_observer","Ionian::Extension::IO","Ionian/Extension/IO.html#method-i-register_observer","(&block)","<p>Register a block to be called when #run_match receives matched data. Method\ncallbacks can be registered …\n"],["reuse_addr","Ionian::Extension::Socket","Ionian/Extension/Socket.html#method-i-reuse_addr","()","<p>Returns true if local address reuse is allowed. ( SO_REUSEADDR )\n"],["reuse_addr=","Ionian::Extension::Socket","Ionian/Extension/Socket.html#method-i-reuse_addr-3D","(value)","<p>Allows local address reuse if true. ( SO_REUSEADDR )\n"],["reuse_addr?","Ionian::Extension::Socket","Ionian/Extension/Socket.html#method-i-reuse_addr-3F","()",""],["run_match","Ionian::Extension::IO","Ionian/Extension/IO.html#method-i-run_match","(**kwargs)","<p>Start a thread that checks for data and notifies listeners (do |match,\nsocket|). Passes kwargs to #read_match …\n"],["ttl","Ionian::Extension::Socket","Ionian/Extension/Socket.html#method-i-ttl","()","<p>Returns the time to live (hop limit). ( IP_TTL )\n"],["ttl=","Ionian::Extension::Socket","Ionian/Extension/Socket.html#method-i-ttl-3D","(value)","<p>Sets the time to live (hop limit). ( IP_TTL )\n"],["ttl?","Ionian::Extension::Socket","Ionian/Extension/Socket.html#method-i-ttl-3F","()",""],["unregister_observer","Ionian::Extension::IO","Ionian/Extension/IO.html#method-i-unregister_observer","(&block)","<p>Unregister a block from being called when matched data is received.\n"],["write","Ionian::Socket","Ionian/Socket.html#method-i-write","(string)","<p>Writes the given string to the socket. Returns the number of bytes written.\n"]]}}
1
+ var search_data = {"index":{"searchIndex":["ionian","extension","io","socket","server","socket","<<()","close()","closed?()","cmd()","cork()","cork=()","cork?()","expression()","expression=()","extended()","extended()","flush()","has_data?()","has_data?()","initialize_ionian()","initialize_ionian_socket()","ip_add_membership()","ip_drop_membership()","ip_multicast_if()","ip_multicast_if=()","ip_multicast_loop()","ip_multicast_loop=()","ip_multicast_loop?()","ip_multicast_ttl()","ip_multicast_ttl=()","ipv6_add_membership()","ipv6_drop_membership()","ipv6_multicast_hops()","ipv6_multicast_hops=()","ipv6_multicast_if()","ipv6_multicast_if=()","ipv6_multicast_loop()","ipv6_multicast_loop=()","ipv6_multicast_loop?()","listen()","multicast()","multicast?()","new()","new()","no_delay()","no_delay=()","no_delay?()","on_accept()","on_match()","on_match()","persistent?()","purge()","puts()","read_all()","read_match()","recork()","register_accept_listener()","register_observer()","register_observer()","reuse_addr()","reuse_addr=()","reuse_addr?()","run_match()","ttl()","ttl=()","ttl?()","unregister_accept_listener()","unregister_observer()","unregister_observer()","write()"],"longSearchIndex":["ionian","ionian::extension","ionian::extension::io","ionian::extension::socket","ionian::server","ionian::socket","ionian::socket#<<()","ionian::server#close()","ionian::socket#closed?()","ionian::socket#cmd()","ionian::extension::socket#cork()","ionian::extension::socket#cork=()","ionian::extension::socket#cork?()","ionian::extension::io#expression()","ionian::extension::io#expression=()","ionian::extension::io::extended()","ionian::extension::socket::extended()","ionian::socket#flush()","ionian::extension::io#has_data?()","ionian::socket#has_data?()","ionian::extension::io#initialize_ionian()","ionian::extension::socket#initialize_ionian_socket()","ionian::extension::socket#ip_add_membership()","ionian::extension::socket#ip_drop_membership()","ionian::extension::socket#ip_multicast_if()","ionian::extension::socket#ip_multicast_if=()","ionian::extension::socket#ip_multicast_loop()","ionian::extension::socket#ip_multicast_loop=()","ionian::extension::socket#ip_multicast_loop?()","ionian::extension::socket#ip_multicast_ttl()","ionian::extension::socket#ip_multicast_ttl=()","ionian::extension::socket#ipv6_add_membership()","ionian::extension::socket#ipv6_drop_membership()","ionian::extension::socket#ipv6_multicast_hops()","ionian::extension::socket#ipv6_multicast_hops=()","ionian::extension::socket#ipv6_multicast_if()","ionian::extension::socket#ipv6_multicast_if=()","ionian::extension::socket#ipv6_multicast_loop()","ionian::extension::socket#ipv6_multicast_loop=()","ionian::extension::socket#ipv6_multicast_loop?()","ionian::server#listen()","ionian::extension::socket#multicast()","ionian::extension::socket#multicast?()","ionian::server::new()","ionian::socket::new()","ionian::extension::socket#no_delay()","ionian::extension::socket#no_delay=()","ionian::extension::socket#no_delay?()","ionian::server#on_accept()","ionian::extension::io#on_match()","ionian::socket#on_match()","ionian::socket#persistent?()","ionian::extension::io#purge()","ionian::socket#puts()","ionian::extension::io#read_all()","ionian::extension::io#read_match()","ionian::extension::socket#recork()","ionian::server#register_accept_listener()","ionian::extension::io#register_observer()","ionian::socket#register_observer()","ionian::extension::socket#reuse_addr()","ionian::extension::socket#reuse_addr=()","ionian::extension::socket#reuse_addr?()","ionian::extension::io#run_match()","ionian::extension::socket#ttl()","ionian::extension::socket#ttl=()","ionian::extension::socket#ttl?()","ionian::server#unregister_accept_listener()","ionian::extension::io#unregister_observer()","ionian::socket#unregister_observer()","ionian::socket#write()"],"info":[["Ionian","","Ionian.html","","<p>A library to simplify interaction with IO streams. This includes network\nsockets, file sockets, and serial …\n"],["Ionian::Extension","","Ionian/Extension.html","","<p>A collection of mixins.\n"],["Ionian::Extension::IO","","Ionian/Extension/IO.html","","<p>A mixin for IO objects that allows regular expression matching and\nconvenient notification of received …\n"],["Ionian::Extension::Socket","","Ionian/Extension/Socket.html","","<p>A mixin for Socket objects.\n<p>This module was designed to be extended by instantiated objects that\nimplement …\n"],["Ionian::Server","","Ionian/Server.html","","<p>A convenient wrapper for TCP, UDP, and Unix server sockets.\n"],["Ionian::Socket","","Ionian/Socket.html","","<p>A convenient wrapper for TCP, UDP, and Unix client sockets.\n"],["<<","Ionian::Socket","Ionian/Socket.html#method-i-3C-3C","(string)",""],["close","Ionian::Server","Ionian/Server.html#method-i-close","()","<p>Shutdown the server socket and stop listening for connections.\n"],["closed?","Ionian::Socket","Ionian/Socket.html#method-i-closed-3F","()","<p>Returns true if the socket is closed.\n"],["cmd","Ionian::Socket","Ionian/Socket.html#method-i-cmd","(string, **kwargs, &block)","<p>Send a command (data) to the socket. Returns an array of received matches.\nBlock yields received match. …\n"],["cork","Ionian::Extension::Socket","Ionian/Extension/Socket.html#method-i-cork","()","<p>Returns true if multiple writes are buffered into a single segment. See\n#recork. Linux only. ( TCP_CORK …\n"],["cork=","Ionian::Extension::Socket","Ionian/Extension/Socket.html#method-i-cork-3D","(value)","<p>Buffers multiple writes into a single segment if true. The segment is sent\nonce the cork flag is disabled, …\n"],["cork?","Ionian::Extension::Socket","Ionian/Extension/Socket.html#method-i-cork-3F","()",""],["expression","Ionian::Extension::IO","Ionian/Extension/IO.html#method-i-expression","()","<p>Returns the regular expression used for #read_match.\n"],["expression=","Ionian::Extension::IO","Ionian/Extension/IO.html#method-i-expression-3D","(exp)","<p>Set the expression to match against the read buffer. Can be a regular\nexpression specifying capture groups, …\n"],["extended","Ionian::Extension::IO","Ionian/Extension/IO.html#method-c-extended","(obj)","<p>Called automaticallly when the object is extended with #extend.\n"],["extended","Ionian::Extension::Socket","Ionian/Extension/Socket.html#method-c-extended","(obj)","<p>Called automaticallly when the object is extended with #extend.\n"],["flush","Ionian::Socket","Ionian/Socket.html#method-i-flush","()","<p>Flushes buffered data to the operating system. This method has no effect on\nnon-persistent sockets.\n"],["has_data?","Ionian::Extension::IO","Ionian/Extension/IO.html#method-i-has_data-3F","(timeout: 0)","<p>Returns true if there is data in the receive buffer. Args:\n\n<pre>Timeout: Number of seconds to wait for data ...</pre>\n"],["has_data?","Ionian::Socket","Ionian/Socket.html#method-i-has_data-3F","(**kwargs)","<p>Returns true if there is data in the receive buffer. Args:\n\n<pre>Timeout: Number of seconds to wait for data ...</pre>\n"],["initialize_ionian","Ionian::Extension::IO","Ionian/Extension/IO.html#method-i-initialize_ionian","()","<p>Initialize the Ionian instance variables. This is called automatically if\n#extend is called on an object. …\n"],["initialize_ionian_socket","Ionian::Extension::Socket","Ionian/Extension/Socket.html#method-i-initialize_ionian_socket","()","<p>Initialize the Ionian Socket variables. This is called automatically if\n#extend is called on an object. …\n"],["ip_add_membership","Ionian::Extension::Socket","Ionian/Extension/Socket.html#method-i-ip_add_membership","(address = nil, interface = nil)","<p>Join a multicast group. Address is the class D multicast address (uses\nremote address if not specified). …\n"],["ip_drop_membership","Ionian::Extension::Socket","Ionian/Extension/Socket.html#method-i-ip_drop_membership","(address = nil, interface = nil)","<p>Leave a multicast group. Address is the class D multicast address (uses\nremote address if not specified). …\n"],["ip_multicast_if","Ionian::Extension::Socket","Ionian/Extension/Socket.html#method-i-ip_multicast_if","()","<p>Returns the default interface for outgoing multicasts. ( IP_MULTICAST_IF )\n"],["ip_multicast_if=","Ionian::Extension::Socket","Ionian/Extension/Socket.html#method-i-ip_multicast_if-3D","(interface = nil)","<p>Specify default interface for outgoing multicasts. ( IP_MULTICAST_IF )\n"],["ip_multicast_loop","Ionian::Extension::Socket","Ionian/Extension/Socket.html#method-i-ip_multicast_loop","()","<p>Returns true if loopback of outgoing multicasts is enabled. (\nIP_MULTICAST_LOOP )\n"],["ip_multicast_loop=","Ionian::Extension::Socket","Ionian/Extension/Socket.html#method-i-ip_multicast_loop-3D","(value)","<p>Enables loopback of outgoing multicasts if true. ( IP_MULTICAST_LOOP )\n"],["ip_multicast_loop?","Ionian::Extension::Socket","Ionian/Extension/Socket.html#method-i-ip_multicast_loop-3F","()",""],["ip_multicast_ttl","Ionian::Extension::Socket","Ionian/Extension/Socket.html#method-i-ip_multicast_ttl","()","<p>Returns the time to live (hop limit) for outgoing multicasts. (\nIP_MULTICAST_TTL )\n"],["ip_multicast_ttl=","Ionian::Extension::Socket","Ionian/Extension/Socket.html#method-i-ip_multicast_ttl-3D","(value)","<p>Set the time to live (hop limit) for outgoing multicasts. (\nIP_MULTICAST_TTL )\n"],["ipv6_add_membership","Ionian::Extension::Socket","Ionian/Extension/Socket.html#method-i-ipv6_add_membership","()",""],["ipv6_drop_membership","Ionian::Extension::Socket","Ionian/Extension/Socket.html#method-i-ipv6_drop_membership","()",""],["ipv6_multicast_hops","Ionian::Extension::Socket","Ionian/Extension/Socket.html#method-i-ipv6_multicast_hops","()",""],["ipv6_multicast_hops=","Ionian::Extension::Socket","Ionian/Extension/Socket.html#method-i-ipv6_multicast_hops-3D","(value)",""],["ipv6_multicast_if","Ionian::Extension::Socket","Ionian/Extension/Socket.html#method-i-ipv6_multicast_if","()",""],["ipv6_multicast_if=","Ionian::Extension::Socket","Ionian/Extension/Socket.html#method-i-ipv6_multicast_if-3D","(value)",""],["ipv6_multicast_loop","Ionian::Extension::Socket","Ionian/Extension/Socket.html#method-i-ipv6_multicast_loop","()",""],["ipv6_multicast_loop=","Ionian::Extension::Socket","Ionian/Extension/Socket.html#method-i-ipv6_multicast_loop-3D","(value)",""],["ipv6_multicast_loop?","Ionian::Extension::Socket","Ionian/Extension/Socket.html#method-i-ipv6_multicast_loop-3F","()",""],["listen","Ionian::Server","Ionian/Server.html#method-i-listen","(&block)","<p>Starts the socket server listening for connections. Blocks registered with\n#register_accept_listener …\n"],["multicast","Ionian::Extension::Socket","Ionian/Extension/Socket.html#method-i-multicast","(address)","<p>Returns true if the given address is within the multicast range.\n"],["multicast?","Ionian::Extension::Socket","Ionian/Extension/Socket.html#method-i-multicast-3F","(address)",""],["new","Ionian::Server","Ionian/Server.html#method-c-new","(**kwargs, &block)",""],["new","Ionian::Socket","Ionian/Socket.html#method-c-new","(existing_socket = nil, **kwargs)","<p>Creates a new socket or wraps an existing socket.\n<p>Args:\n\n<pre>host: IP or hostname to connect to.\nport: ...</pre>\n"],["no_delay","Ionian::Extension::Socket","Ionian/Extension/Socket.html#method-i-no_delay","()","<p>Returns true if the Nagle algorithm is disabled. ( TCP_NODELAY )\n"],["no_delay=","Ionian::Extension::Socket","Ionian/Extension/Socket.html#method-i-no_delay-3D","(value)","<p>Disables the Nagle algorithm if true. ( TCP_NODELAY )\n"],["no_delay?","Ionian::Extension::Socket","Ionian/Extension/Socket.html#method-i-no_delay-3F","()",""],["on_accept","Ionian::Server","Ionian/Server.html#method-i-on_accept","(&block)",""],["on_match","Ionian::Extension::IO","Ionian/Extension/IO.html#method-i-on_match","(&block)",""],["on_match","Ionian::Socket","Ionian/Socket.html#method-i-on_match","(&block)",""],["persistent?","Ionian::Socket","Ionian/Socket.html#method-i-persistent-3F","()","<p>Returns true if the socket remains open after writing data.\n"],["purge","Ionian::Extension::IO","Ionian/Extension/IO.html#method-i-purge","()","<p>Erase the data in the IO and Ionian buffers. This is typically handled\nautomatically.\n"],["puts","Ionian::Socket","Ionian/Socket.html#method-i-puts","(*string)","<p>Writes the given string(s) to the socket and appends a newline character to\nany string not already ending …\n"],["read_all","Ionian::Extension::IO","Ionian/Extension/IO.html#method-i-read_all","()","<p>Read all data in the buffer. An alternative to using #readpartial with a\nlarge length.\n"],["read_match","Ionian::Extension::IO","Ionian/Extension/IO.html#method-i-read_match","(**kwargs, &block)","<p>Read matched data from the buffer. This method SHOULD NOT be used if\n#run_match is used.\n<p>Passes matches …\n"],["recork","Ionian::Extension::Socket","Ionian/Extension/Socket.html#method-i-recork","()","<p>Unsets cork to transmit data, then reapplies cork. ( TCP_CORK )\n"],["register_accept_listener","Ionian::Server","Ionian/Server.html#method-i-register_accept_listener","(&block)","<p>Register a block to be run when server accepts a client connection. The\nconnected client is passed to …\n"],["register_observer","Ionian::Extension::IO","Ionian/Extension/IO.html#method-i-register_observer","(&block)","<p>Register a block to be called when #run_match receives matched data. Method\ncallbacks can be registered …\n"],["register_observer","Ionian::Socket","Ionian/Socket.html#method-i-register_observer","(&block)","<p>Register a block to be called when #run_match receives matched data. Method\ncallbacks can be registered …\n"],["reuse_addr","Ionian::Extension::Socket","Ionian/Extension/Socket.html#method-i-reuse_addr","()","<p>Returns true if local address reuse is allowed. ( SO_REUSEADDR )\n"],["reuse_addr=","Ionian::Extension::Socket","Ionian/Extension/Socket.html#method-i-reuse_addr-3D","(value)","<p>Allows local address reuse if true. ( SO_REUSEADDR )\n"],["reuse_addr?","Ionian::Extension::Socket","Ionian/Extension/Socket.html#method-i-reuse_addr-3F","()",""],["run_match","Ionian::Extension::IO","Ionian/Extension/IO.html#method-i-run_match","(**kwargs)","<p>Start a thread that checks for data and notifies listeners (do |match,\nsocket|). Passes kwargs to #read_match …\n"],["ttl","Ionian::Extension::Socket","Ionian/Extension/Socket.html#method-i-ttl","()","<p>Returns the time to live (hop limit). ( IP_TTL )\n"],["ttl=","Ionian::Extension::Socket","Ionian/Extension/Socket.html#method-i-ttl-3D","(value)","<p>Sets the time to live (hop limit). ( IP_TTL )\n"],["ttl?","Ionian::Extension::Socket","Ionian/Extension/Socket.html#method-i-ttl-3F","()",""],["unregister_accept_listener","Ionian::Server","Ionian/Server.html#method-i-unregister_accept_listener","(proc)","<p>Unregisters a socket accept notifier block.\n"],["unregister_observer","Ionian::Extension::IO","Ionian/Extension/IO.html#method-i-unregister_observer","(&block)","<p>Unregister a block from being called when matched data is received.\n"],["unregister_observer","Ionian::Socket","Ionian/Socket.html#method-i-unregister_observer","(&block)","<p>Unregister a block from being called when matched data is received.\n"],["write","Ionian::Socket","Ionian/Socket.html#method-i-write","(string)","<p>Writes the given string to the socket. Returns the number of bytes written.\n"]]}}
data/doc/rdoc.css CHANGED
@@ -193,7 +193,8 @@ nav h2 {
193
193
  text-align: center;
194
194
  }
195
195
 
196
- nav h3 {
196
+ nav h3,
197
+ #table-of-contents-navigation {
197
198
  margin: 0;
198
199
  padding: 2px 8px 2px 8px;
199
200
  text-align: right;
@@ -213,8 +214,13 @@ nav p {
213
214
  border-top: 0;
214
215
  }
215
216
 
216
- #home-section h2,
217
- #home-section h3 {
217
+ #home-section h2 {
218
+ text-align: center;
219
+ }
220
+
221
+ #table-of-contents-navigation {
222
+ font-size: 1.2em;
223
+ font-weight: bold;
218
224
  text-align: center;
219
225
  }
220
226
 
@@ -40,6 +40,9 @@
40
40
  <li class="module">
41
41
  <a href="Ionian/Extension/Socket.html">Ionian::Extension::Socket</a>
42
42
  </li>
43
+ <li class="class">
44
+ <a href="Ionian/Server.html">Ionian::Server</a>
45
+ </li>
43
46
  <li class="class">
44
47
  <a href="Ionian/Socket.html">Ionian::Socket</a>
45
48
  </li>
@@ -49,25 +52,35 @@
49
52
  <ul>
50
53
 
51
54
  <li class="method">
52
- <a href="Ionian/Extension/IO.html#method-c-extended">::extended</a>
55
+ <a href="Ionian/Extension/Socket.html#method-c-extended">::extended</a>
53
56
  &mdash;
54
- <span class="container">Ionian::Extension::IO</span>
57
+ <span class="container">Ionian::Extension::Socket</span>
55
58
 
56
59
  <li class="method">
57
- <a href="Ionian/Extension/Socket.html#method-c-extended">::extended</a>
60
+ <a href="Ionian/Extension/IO.html#method-c-extended">::extended</a>
58
61
  &mdash;
59
- <span class="container">Ionian::Extension::Socket</span>
62
+ <span class="container">Ionian::Extension::IO</span>
60
63
 
61
64
  <li class="method">
62
65
  <a href="Ionian/Socket.html#method-c-new">::new</a>
63
66
  &mdash;
64
67
  <span class="container">Ionian::Socket</span>
65
68
 
69
+ <li class="method">
70
+ <a href="Ionian/Server.html#method-c-new">::new</a>
71
+ &mdash;
72
+ <span class="container">Ionian::Server</span>
73
+
66
74
  <li class="method">
67
75
  <a href="Ionian/Socket.html#method-i-3C-3C">#&lt;&lt;</a>
68
76
  &mdash;
69
77
  <span class="container">Ionian::Socket</span>
70
78
 
79
+ <li class="method">
80
+ <a href="Ionian/Server.html#method-i-close">#close</a>
81
+ &mdash;
82
+ <span class="container">Ionian::Server</span>
83
+
71
84
  <li class="method">
72
85
  <a href="Ionian/Socket.html#method-i-closed-3F">#closed?</a>
73
86
  &mdash;
@@ -218,6 +231,11 @@
218
231
  &mdash;
219
232
  <span class="container">Ionian::Extension::Socket</span>
220
233
 
234
+ <li class="method">
235
+ <a href="Ionian/Server.html#method-i-listen">#listen</a>
236
+ &mdash;
237
+ <span class="container">Ionian::Server</span>
238
+
221
239
  <li class="method">
222
240
  <a href="Ionian/Extension/Socket.html#method-i-multicast">#multicast</a>
223
241
  &mdash;
@@ -243,18 +261,23 @@
243
261
  &mdash;
244
262
  <span class="container">Ionian::Extension::Socket</span>
245
263
 
264
+ <li class="method">
265
+ <a href="Ionian/Server.html#method-i-on_accept">#on_accept</a>
266
+ &mdash;
267
+ <span class="container">Ionian::Server</span>
268
+
246
269
  <li class="method">
247
270
  <a href="Ionian/Extension/IO.html#method-i-on_match">#on_match</a>
248
271
  &mdash;
249
272
  <span class="container">Ionian::Extension::IO</span>
250
273
 
251
274
  <li class="method">
252
- <a href="Ionian/Socket.html#method-i-persistent-3F">#persistent?</a>
275
+ <a href="Ionian/Socket.html#method-i-on_match">#on_match</a>
253
276
  &mdash;
254
277
  <span class="container">Ionian::Socket</span>
255
278
 
256
279
  <li class="method">
257
- <a href="Ionian/Socket.html#method-i-protocol-3F">#protocol?</a>
280
+ <a href="Ionian/Socket.html#method-i-persistent-3F">#persistent?</a>
258
281
  &mdash;
259
282
  <span class="container">Ionian::Socket</span>
260
283
 
@@ -268,6 +291,11 @@
268
291
  &mdash;
269
292
  <span class="container">Ionian::Socket</span>
270
293
 
294
+ <li class="method">
295
+ <a href="Ionian/Extension/IO.html#method-i-read_all">#read_all</a>
296
+ &mdash;
297
+ <span class="container">Ionian::Extension::IO</span>
298
+
271
299
  <li class="method">
272
300
  <a href="Ionian/Extension/IO.html#method-i-read_match">#read_match</a>
273
301
  &mdash;
@@ -278,11 +306,21 @@
278
306
  &mdash;
279
307
  <span class="container">Ionian::Extension::Socket</span>
280
308
 
309
+ <li class="method">
310
+ <a href="Ionian/Server.html#method-i-register_accept_listener">#register_accept_listener</a>
311
+ &mdash;
312
+ <span class="container">Ionian::Server</span>
313
+
281
314
  <li class="method">
282
315
  <a href="Ionian/Extension/IO.html#method-i-register_observer">#register_observer</a>
283
316
  &mdash;
284
317
  <span class="container">Ionian::Extension::IO</span>
285
318
 
319
+ <li class="method">
320
+ <a href="Ionian/Socket.html#method-i-register_observer">#register_observer</a>
321
+ &mdash;
322
+ <span class="container">Ionian::Socket</span>
323
+
286
324
  <li class="method">
287
325
  <a href="Ionian/Extension/Socket.html#method-i-reuse_addr">#reuse_addr</a>
288
326
  &mdash;
@@ -318,6 +356,16 @@
318
356
  &mdash;
319
357
  <span class="container">Ionian::Extension::Socket</span>
320
358
 
359
+ <li class="method">
360
+ <a href="Ionian/Server.html#method-i-unregister_accept_listener">#unregister_accept_listener</a>
361
+ &mdash;
362
+ <span class="container">Ionian::Server</span>
363
+
364
+ <li class="method">
365
+ <a href="Ionian/Socket.html#method-i-unregister_observer">#unregister_observer</a>
366
+ &mdash;
367
+ <span class="container">Ionian::Socket</span>
368
+
321
369
  <li class="method">
322
370
  <a href="Ionian/Extension/IO.html#method-i-unregister_observer">#unregister_observer</a>
323
371
  &mdash;
@@ -333,7 +381,7 @@
333
381
 
334
382
  <footer id="validator-badges" role="contentinfo">
335
383
  <p><a href="http://validator.w3.org/check/referer">Validate</a>
336
- <p>Generated by <a href="http://rdoc.rubyforge.org">RDoc</a> 4.1.0.preview.1.
384
+ <p>Generated by <a href="http://rdoc.rubyforge.org">RDoc</a> 4.1.0.
337
385
  <p>Based on <a href="http://deveiate.org/projects/Darkfish-Rdoc/">Darkfish</a> by <a href="http://deveiate.org">Michael Granger</a>.
338
386
  </footer>
339
387
 
@@ -51,6 +51,12 @@ module Ionian
51
51
  @ionian_expression = Regexp.new "(.*?)#{expression}" if exp.is_a? String
52
52
  end
53
53
 
54
+ # Read all data in the buffer.
55
+ # An alternative to using #readpartial with a large length.
56
+ def read_all
57
+ readpartial 0xFFFF
58
+ end
59
+
54
60
  # Read matched data from the buffer.
55
61
  # This method SHOULD NOT be used if #run_match is used.
56
62
  #
@@ -72,7 +78,7 @@ module Ionian
72
78
  # timeout: Timeout in seconds IO::select will block.
73
79
  # skip_select: Skip over the IO::select statement. Use if you
74
80
  # are calling IO::select ahead of this method.
75
- # build_methods: Build method accessors from named captures.
81
+ # build_methods: Build accessor methods from named capture groups.
76
82
  # Enabled by default.
77
83
  def read_match(**kwargs, &block)
78
84
  timeout = kwargs.fetch :timeout, @ionian_timeout
@@ -0,0 +1,85 @@
1
+ require 'socket'
2
+ require 'ionian/socket'
3
+
4
+ module Ionian
5
+
6
+ # A convenient wrapper for TCP, UDP, and Unix server sockets.
7
+ class Server
8
+
9
+ def initialize **kwargs, &block
10
+ @accept_listeners = []
11
+ register_accept_listener &block if block_given?
12
+
13
+ @interface = kwargs.fetch :interface, ''
14
+ @port = kwargs.fetch :port, nil
15
+
16
+
17
+ # Automatically select UDP for the multicast range. Otherwise default to TCP.
18
+ default_protocol = :tcp
19
+ # TODO: This ivar may be incorrect for UDP -- bound interface is not destination.
20
+ default_protocol = :udp if Ionian::Extension::Socket.multicast? @interface
21
+ default_protocol = :unix if @interface.start_with? '/'
22
+
23
+ @protocol = kwargs.fetch :protocol, default_protocol
24
+
25
+ # TODO: Move this to #listen.
26
+ case @protocol
27
+ when :tcp
28
+ @server = TCPServer.new @interface, @port
29
+ @server.setsockopt ::Socket::SOL_SOCKET, ::Socket::SO_REUSEADDR, [1].pack('i')
30
+ when :udp
31
+ @server = Ionian::Socket.new host: @interface, port: @port, protocol: :udp
32
+ when :unix
33
+ @server = UNIXServer.new @interface
34
+ end
35
+ end
36
+
37
+ # Starts the socket server listening for connections.
38
+ # Blocks registered with #register_accept_listener will
39
+ # be run when a connection is accepted.
40
+ def listen &block
41
+ register_accept_listener &block if block_given?
42
+
43
+ @accept_thread ||= Thread.new do
44
+ # Package in an Ionian::Socket
45
+ begin
46
+ client = Ionian::Socket.new @server.accept
47
+
48
+ @accept_listeners.each do |listener|
49
+ listener.call client
50
+ end
51
+ rescue Errno::EBADF
52
+ # This ignores the connection if the client closed it before it
53
+ # could be accepted.
54
+ rescue IOError
55
+ # This ignores the connection if the client closed it before it
56
+ # could be accepted.
57
+ end
58
+ end
59
+ end
60
+
61
+ # Shutdown the server socket and stop listening for connections.
62
+ def close
63
+ @server.close if @server
64
+ @accept_thread.join if @accept_thread
65
+ @accept_thread = nil
66
+ end
67
+
68
+ # Register a block to be run when server accepts a client connection.
69
+ # The connected client is passed to the block as an Ionain::Client.
70
+ def register_accept_listener &block
71
+ @accept_listeners << block unless @accept_listeners.include? block
72
+ block
73
+ end
74
+
75
+ alias_method :on_accept, :register_accept_listener
76
+
77
+ # Unregisters a socket accept notifier block.
78
+ def unregister_accept_listener proc
79
+ @accept_listeners.delete_if {|o| o == proc}
80
+ proc
81
+ end
82
+
83
+ end
84
+
85
+ end
data/lib/ionian/socket.rb CHANGED
@@ -2,9 +2,12 @@ require 'ionian/extension/socket'
2
2
 
3
3
  module Ionian
4
4
 
5
- # A convenient wrapper for TCP, UDP, and Unix sockets.
5
+ # A convenient wrapper for TCP, UDP, and Unix client sockets.
6
6
  class Socket
7
+ attr_accessor :expression
7
8
 
9
+ # Creates a new socket or wraps an existing socket.
10
+ #
8
11
  # Args:
9
12
  # host: IP or hostname to connect to.
10
13
  # port: Connection's port number. Default is 23. Unused by :unix protocol.
@@ -20,37 +23,70 @@ module Ionian
20
23
  # cork: Set true to enable the TCP_CORK flag. Buffers multiple writes
21
24
  # into one segment.
22
25
  # expression: Overrides the #read_match regular expression for received data.
23
- def initialize(**kwargs)
24
- @socket = nil
26
+ def initialize(existing_socket = nil, **kwargs)
27
+ @socket = existing_socket
25
28
 
26
- # TODO: Should be able to parse the port out of host.
27
- # :port should override this parsed value.
29
+ @ionian_listeners = []
28
30
 
29
- @host = kwargs.fetch :host
30
- @port = kwargs.fetch :port, 23
31
- @bind_port = kwargs.fetch :bind_port, @port
31
+ @expression = kwargs.fetch :expression, nil
32
32
 
33
- # Automatically select UDP for the multicast range. Otherwise default to TCP.
34
- default_protocol = :tcp
35
- default_protocol = :udp if Ionian::Extension::Socket.multicast? @host
36
- default_protocol = :unix if @host.start_with? '/'
33
+ if existing_socket
34
+ # Convert existing socket.
35
+ @socket.extend Ionian::Extension::IO
36
+ @socket.extend Ionian::Extension::Socket
37
+
38
+ if existing_socket.is_a? UNIXSocket
39
+ @host = existing_socket.path
40
+ @port = nil
41
+ else
42
+ @host = existing_socket.remote_address.ip_address if existing_socket
43
+ @port = existing_socket.remote_address.ip_port if existing_socket
44
+ end
37
45
 
38
- @protocol = kwargs.fetch :protocol, default_protocol
39
- @persistent = kwargs.fetch :persistent, true
40
- @expression = kwargs.fetch :expression, nil
46
+ if @socket.is_a? TCPSocket
47
+ @protocol = :tcp
48
+ elsif @socket.is_a? UDPSocket
49
+ @protocol = :udp
50
+ elsif @socket.is_a? UNIXSocket
51
+ @protocol = :unix
52
+ end
53
+
54
+ @persistent = true # Existing sockets are always persistent.
55
+
56
+ @socket.expression = @expression if @expression
57
+
58
+ initialize_socket_methods
59
+ else
60
+ # Initialize new socket.
61
+
62
+ # TODO: Should be able to parse the port out of host.
63
+ # :port should override this parsed value.
64
+
65
+ @host = kwargs.fetch :host
66
+ @port = kwargs.fetch :port, 23
67
+ @bind_port = kwargs.fetch :bind_port, @port
41
68
 
42
- @reuse_addr = kwargs.fetch :reuse_addr, false
43
- @no_delay = kwargs.fetch :no_delay, false
44
- @cork = kwargs.fetch :cork, false
69
+ # Automatically select UDP for the multicast range. Otherwise default to TCP.
70
+ default_protocol = :tcp
71
+ default_protocol = :udp if Ionian::Extension::Socket.multicast? @host
72
+ default_protocol = :unix if @host.start_with? '/'
73
+
74
+ @protocol = kwargs.fetch :protocol, default_protocol
75
+ @persistent = kwargs.fetch :persistent, true
76
+
77
+ @reuse_addr = kwargs.fetch :reuse_addr, false
78
+ @no_delay = kwargs.fetch :no_delay, false
79
+ @cork = kwargs.fetch :cork, false
45
80
 
46
- create_socket if @persistent
81
+
82
+ create_socket if @persistent
83
+ end
47
84
  end
48
85
 
49
86
  # Returns a symbol of the type of protocol this socket uses:
50
87
  # :tcp, :udp, :unix
51
- def protocol?
52
- @protocol
53
- end
88
+ attr_reader :protocol
89
+ alias_method :protocol?, :protocol
54
90
 
55
91
  # Returns true if the socket remains open after writing data.
56
92
  def persistent?
@@ -78,6 +114,24 @@ module Ionian
78
114
  matches
79
115
  end
80
116
 
117
+ # Register a block to be called when #run_match receives matched data.
118
+ # Method callbacks can be registered with &object.method(:method).
119
+ # Returns a reference to the given block.
120
+ # block = ionian_socket.register_observer {...}
121
+ def register_observer &block
122
+ @ionian_listeners << block unless @ionian_listeners.include? block
123
+ @socket.register_observer &block if @socket
124
+ block
125
+ end
126
+
127
+ alias_method :on_match, :register_observer
128
+
129
+ # Unregister a block from being called when matched data is received.
130
+ def unregister_observer(&block)
131
+ @ionian_listeners.delete_if {|o| o == block}
132
+ @socket.unregister_observer &block if @socket
133
+ block
134
+ end
81
135
 
82
136
  ### Methods Forwarded To @socket ###
83
137
 
@@ -145,6 +199,7 @@ module Ionian
145
199
  when :tcp
146
200
  @socket = ::TCPSocket.new @host, @port
147
201
  @socket.extend Ionian::Extension::Socket
202
+ @socket.expression = @expression if @expression
148
203
  @socket.no_delay = true if @no_delay
149
204
  @socket.cork = true if @cork
150
205
 
@@ -170,6 +225,9 @@ module Ionian
170
225
 
171
226
  @socket.expression = @expression if @expression
172
227
 
228
+ # Register listeners.
229
+ @ionian_listeners.each { |proc| @socket.on_match &proc }
230
+
173
231
  initialize_socket_methods
174
232
  end
175
233
 
data/lib/ionian.rb CHANGED
@@ -1,6 +1,7 @@
1
1
  require 'ionian/extension/io'
2
2
  require 'ionian/extension/socket'
3
3
  require 'ionian/socket'
4
+ require 'ionian/server'
4
5
 
5
6
  # A library to simplify interaction with IO streams.
6
7
  # This includes network sockets, file sockets, and