/* * call-seq: * bsock.remote_address => addrinfo * * Returns an Addrinfo object for remote address obtained by getpeername. * * Note that addrinfo.protocol is filled by 0. * * TCPSocket.open("www.ruby-lang.org", 80) {|s| * p s.remote_address #=> #<Addrinfo: 221.186.184.68:80 TCP> * } * * TCPServer.open("127.0.0.1", 1728) {|serv| * c = TCPSocket.new("127.0.0.1", 1728) * s = serv.accept * p s.remote_address #=> #<Addrinfo: 127.0.0.1:36504 TCP> * } * */ static VALUE bsock_remote_address(VALUE sock) { struct sockaddr_storage buf; socklen_t len = (socklen_t)sizeof buf; rb_io_t *fptr; GetOpenFile(sock, fptr); if (getpeername(fptr->fd, (struct sockaddr*)&buf, &len) < 0) rb_sys_fail("getpeername(2)"); return rsock_fd_socket_addrinfo(fptr->fd, (struct sockaddr *)&buf, len); }
/* * call-seq: * bsock.remote_address => addrinfo * * Returns an Addrinfo object for remote address obtained by getpeername. * * Note that addrinfo.protocol is filled by 0. * * TCPSocket.open("www.ruby-lang.org", 80) {|s| * p s.remote_address #=> #<Addrinfo: 221.186.184.68:80 TCP> * } * * TCPServer.open("127.0.0.1", 1728) {|serv| * c = TCPSocket.new("127.0.0.1", 1728) * s = serv.accept * p s.remote_address #=> #<Addrinfo: 127.0.0.1:36504 TCP> * } * */ static VALUE bsock_remote_address(VALUE sock) { union_sockaddr buf; socklen_t len = (socklen_t)sizeof buf; socklen_t len0 = len; rb_io_t *fptr; GetOpenFile(sock, fptr); if (getpeername(fptr->fd, &buf.addr, &len) < 0) rb_sys_fail("getpeername(2)"); if (len0 < len) len = len0; return rsock_fd_socket_addrinfo(fptr->fd, &buf.addr, len); }
/* * call-seq: * bsock.local_address => addrinfo * * Returns an Addrinfo object for local address obtained by getsockname. * * Note that addrinfo.protocol is filled by 0. * * TCPSocket.open("www.ruby-lang.org", 80) {|s| * p s.local_address #=> #<Addrinfo: 192.168.0.129:36873 TCP> * } * * TCPServer.open("127.0.0.1", 1512) {|serv| * p serv.local_address #=> #<Addrinfo: 127.0.0.1:1512 TCP> * } * */ static VALUE bsock_local_address(VALUE sock) { UNRUBBY_SOCKET_HACK; struct sockaddr_storage buf; socklen_t len = (socklen_t)sizeof buf; socklen_t len0 = len; rb_io_t *fptr; GetOpenFile(sock, fptr); if (getsockname(fptr->fd, (struct sockaddr*)&buf, &len) < 0) rb_sys_fail("getsockname(2)"); if (len0 < len) len = len0; return rsock_fd_socket_addrinfo(fptr->fd, (struct sockaddr *)&buf, len); }