Class | BasicSocket
In: | socket/socket.c
Parent: | IO

### Methods

close_read close_write do_not_reverse_lookup do_not_reverse_lookup= for_fd getpeername getsockname getsockopt recv send setsockopt shutdown

### Public Class methods

do_not_reverse_lookup()
do_not_reverse_lookup=(p1)
for_fd(p1)

### Public Instance methods

close_read()
close_write()
getpeername()
getsockname()
getsockopt(level, optname)

Gets a socket option. These are protocol and system specific, see your local sytem documentation for details. The option is returned as a String with the data being the binary value of the socket option.

### Parameters

- `level` is an integer, usually one of the SOL_ constants such as Socket::SOL_SOCKET, or a protocol level.
- `optname` is an integer, usually one of the SO_ constants, such as Socket::SO_REUSEADDR.

### Examples

Some socket options are integers with boolean values, in this case getsockopt could be called like this:

      optval = sock.getsockopt(Socket::SOL_SOCKET,Socket::SO_REUSEADDR)
      optval = optval.unpack "i"
      reuseaddr = optval[0] == 0 ? false : true

Some socket options are integers with numeric values, in this case getsockopt could be called like this:

      optval = sock.getsockopt(Socket::IPPROTO_IP, Socket::IP_TTL)
      ipttl = optval.unpack("i")[0]

Option values may be structs. Decoding them can be complex as it involves examining your system headers to determine the correct definition. An example is a +struct linger+, which may be defined in your system headers as:

      struct linger {
        int l_onoff;
        int l_linger;
      };

In this case getsockopt could be called like this:

      optval =  sock.getsockopt(Socket::SOL_SOCKET, Socket::SO_LINGER)
      onoff, linger = optval.unpack "ii"

[Source]

    /*
     * Document-method: getsockopt
     * call-seq: getsockopt(level, optname)
     *
     * Gets a socket option. These are protocol and system specific, see your
     * local sytem documentation for details. The option is returned as
     * a String with the data being the binary value of the socket option.
     *
     * === Parameters
     * * +level+ is an integer, usually one of the SOL_ constants such as
     *   Socket::SOL_SOCKET, or a protocol level.
     * * +optname+ is an integer, usually one of the SO_ constants, such
     *   as Socket::SO_REUSEADDR.
     *
     * === Examples
     *
     * Some socket options are integers with boolean values, in this case
     * #getsockopt could be called like this:
     *   optval = sock.getsockopt(Socket::SOL_SOCKET,Socket::SO_REUSEADDR)
     *   optval = optval.unpack "i"
     *   reuseaddr = optval[0] == 0 ? false : true
     *
     * Some socket options are integers with numeric values, in this case
     * #getsockopt could be called like this:
     *   optval = sock.getsockopt(Socket::IPPROTO_IP, Socket::IP_TTL)
     *   ipttl = optval.unpack("i")[0]
     *
     * Option values may be structs. Decoding them can be complex as it involves
     * examining your system headers to determine the correct definition. An
     * example is a +struct linger+, which may be defined in your system headers
     * as:
     *   struct linger {
     *     int l_onoff;
     *     int l_linger;
     *   };
     *
     * In this case #getsockopt could be called like this:
     *   optval =  sock.getsockopt(Socket::SOL_SOCKET, Socket::SO_LINGER)
     *   onoff, linger = optval.unpack "ii"
    */
    static VALUE
    bsock_getsockopt(sock, lev, optname)
        VALUE sock, lev, optname;
    {
    #if !defined(__BEOS__)
        int level, option;
        socklen_t len;
        char *buf;
        OpenFile *fptr;

        level = NUM2INT(lev);
        option = NUM2INT(optname);
        len = 256;
        buf = ALLOCA_N(char,len);
        GetOpenFile(sock, fptr);

        GetOpenFile(sock, fptr);
        if (getsockopt(fileno(fptr->f), level, option, buf, &len) < 0)
    	rb_sys_fail(fptr->path);

        return rb_str_new(buf, len);
    #else
        rb_notimplement();
    #endif
    }

recv(...)
send(...)
setsockopt(level, optname, optval)

Sets a socket option. These are protocol and system specific, see your local sytem documentation for details.

### Parameters

- `level` is an integer, usually one of the SOL_ constants such as Socket::SOL_SOCKET, or a protocol level.
- `optname` is an integer, usually one of the SO_ constants, such as Socket::SO_REUSEADDR.
- `optval` is the value of the option, it is passed to the underlying setsockopt() as a pointer to a certain number of bytes. How this is done depends on the type:
  - Fixnum: value is assigned to an int, and a pointer to the int is passed, with length of sizeof(int).
  - true or false: 1 or 0 (respectively) is assigned to an int, and the int is passed as for a Fixnum. Note that `false` must be passed, not `nil`.
  - String: the string’s data and length is passed to the socket.

### Examples

Some socket options are integers with boolean values, in this case setsockopt could be called like this:

      sock.setsockopt(Socket::SOL_SOCKET,Socket::SO_REUSEADDR, true)

Some socket options are integers with numeric values, in this case setsockopt could be called like this:

      sock.setsockopt(Socket::IPPROTO_IP, Socket::IP_TTL, 255)

Option values may be structs. Passing them can be complex as it involves examining your system headers to determine the correct definition. An example is an `ip_mreq`, which may be defined in your system headers as:

      struct ip_mreq {
        struct  in_addr imr_multiaddr;
        struct  in_addr imr_interface;
      };

In this case setsockopt could be called like this:

      optval =  IPAddr.new("224.0.0.251") + Socket::INADDR_ANY
      sock.setsockopt(Socket::IPPROTO_IP, Socket::IP_ADD_MEMBERSHIP, optval)

[Source]

    /*
     * Document-method: setsockopt
     * call-seq: setsockopt(level, optname, optval)
     *
     * Sets a socket option. These are protocol and system specific, see your
     * local sytem documentation for details.
     *
     * === Parameters
     * * +level+ is an integer, usually one of the SOL_ constants such as
     *   Socket::SOL_SOCKET, or a protocol level.
     * * +optname+ is an integer, usually one of the SO_ constants, such
     *   as Socket::SO_REUSEADDR.
     * * +optval+ is the value of the option, it is passed to the underlying
     *   setsockopt() as a pointer to a certain number of bytes. How this is
     *   done depends on the type:
     *   - Fixnum: value is assigned to an int, and a pointer to the int is
     *     passed, with length of sizeof(int).
     *   - true or false: 1 or 0 (respectively) is assigned to an int, and the
     *     int is passed as for a Fixnum. Note that +false+ must be passed,
     *     not +nil+.
     *   - String: the string's data and length is passed to the socket.
     *
     * === Examples
     *
     * Some socket options are integers with boolean values, in this case
     * #setsockopt could be called like this:
     *   sock.setsockopt(Socket::SOL_SOCKET,Socket::SO_REUSEADDR, true)
     *
     * Some socket options are integers with numeric values, in this case
     * #setsockopt could be called like this:
     *   sock.setsockopt(Socket::IPPROTO_IP, Socket::IP_TTL, 255)
     *
     * Option values may be structs. Passing them can be complex as it involves
     * examining your system headers to determine the correct definition. An
     * example is an +ip_mreq+, which may be defined in your system headers as:
     *   struct ip_mreq {
     *     struct  in_addr imr_multiaddr;
     *     struct  in_addr imr_interface;
     *   };
     *
     * In this case #setsockopt could be called like this:
     *   optval =  IPAddr.new("224.0.0.251") + Socket::INADDR_ANY
     *   sock.setsockopt(Socket::IPPROTO_IP, Socket::IP_ADD_MEMBERSHIP, optval)
     *
    */
    static VALUE
    bsock_setsockopt(sock, lev, optname, val)
        VALUE sock, lev, optname, val;
    {
        int level, option;
        OpenFile *fptr;
        int i;
        char *v;
        int vlen;

        rb_secure(2);
        level = NUM2INT(lev);
        option = NUM2INT(optname);

        switch (TYPE(val)) {
          case T_FIXNUM:
    	i = FIX2INT(val);
    	goto numval;
          case T_FALSE:
    	i = 0;
    	goto numval;
          case T_TRUE:
    	i = 1;
          numval:
    	v = (char*)&i; vlen = sizeof(i);
    	break;
          default:
    	StringValue(val);
    	v = RSTRING(val)->ptr;
    	vlen = RSTRING(val)->len;
    	break;
        }

        GetOpenFile(sock, fptr);
        if (setsockopt(fileno(fptr->f), level, option, v, vlen) < 0)
    	rb_sys_fail(fptr->path);

        return INT2FIX(0);
    }

shutdown(...)

[Validate]