class IPSocket
Öffentliche Klassenmethoden
Source
static VALUE
ip_s_getaddress(VALUE obj, VALUE host)
{
union_sockaddr addr;
struct rb_addrinfo *res = rsock_addrinfo(host, Qnil, AF_UNSPEC, SOCK_STREAM, 0, Qnil);
socklen_t len = res->ai->ai_addrlen;
/* just take the first one */
memcpy(&addr, res->ai->ai_addr, len);
rb_freeaddrinfo(res);
return rsock_make_ipaddr(&addr.addr, len);
}
Ermittelt die IP-Adresse von host.
require 'socket' IPSocket.getaddress("localhost") #=> "127.0.0.1" IPSocket.getaddress("ip6-localhost") #=> "::1"
Private Klassenmethoden
Öffentliche Instanzmethoden
Source
static VALUE
ip_addr(int argc, VALUE *argv, VALUE sock)
{
union_sockaddr addr;
socklen_t len = (socklen_t)sizeof addr;
int norevlookup;
if (argc < 1 || !rsock_revlookup_flag(argv[0], &norevlookup))
norevlookup = rb_io_mode(sock) & FMODE_NOREVLOOKUP;
if (getsockname(rb_io_descriptor(sock), &addr.addr, &len) < 0)
rb_sys_fail("getsockname(2)");
return rsock_ipaddr(&addr.addr, len, norevlookup);
}
Gibt die lokale Adresse als Array zurück, das address_family, port, hostname und numeric_address enthält.
Wenn reverse_lookup true oder :hostname ist, wird der Hostname aus numeric_address durch eine Reverse-Lookup-Abfrage ermittelt. Wenn es false oder :numeric ist, ist der Hostname derselbe wie numeric_address. Wenn es nil ist oder weggelassen wird, wird ipsocket.do_not_reverse_lookup beachtet. Siehe auch Socket.getaddrinfo.
TCPSocket.open("www.ruby-lang.org", 80) {|sock| p sock.addr #=> ["AF_INET", 49429, "hal", "192.168.0.128"] p sock.addr(true) #=> ["AF_INET", 49429, "hal", "192.168.0.128"] p sock.addr(false) #=> ["AF_INET", 49429, "192.168.0.128", "192.168.0.128"] p sock.addr(:hostname) #=> ["AF_INET", 49429, "hal", "192.168.0.128"] p sock.addr(:numeric) #=> ["AF_INET", 49429, "192.168.0.128", "192.168.0.128"] }
Source
static VALUE
ip_inspect(VALUE sock)
{
VALUE str = rb_call_super(0, 0);
rb_io_t *fptr = RFILE(sock)->fptr;
union_sockaddr addr;
socklen_t len = (socklen_t)sizeof addr;
ID id;
if (fptr && fptr->fd >= 0 &&
getsockname(fptr->fd, &addr.addr, &len) >= 0 &&
(id = rsock_intern_family(addr.addr.sa_family)) != 0) {
VALUE family = rb_id2str(id);
char hbuf[1024], pbuf[1024];
long slen = RSTRING_LEN(str);
const char last = (slen > 1 && RSTRING_PTR(str)[slen - 1] == '>') ?
(--slen, '>') : 0;
str = rb_str_subseq(str, 0, slen);
rb_str_cat_cstr(str, ", ");
rb_str_append(str, family);
if (!rb_getnameinfo(&addr.addr, len, hbuf, sizeof(hbuf),
pbuf, sizeof(pbuf), NI_NUMERICHOST | NI_NUMERICSERV)) {
rb_str_cat_cstr(str, ", ");
rb_str_cat_cstr(str, hbuf);
rb_str_cat_cstr(str, ", ");
rb_str_cat_cstr(str, pbuf);
}
if (last) rb_str_cat(str, &last, 1);
}
return str;
}
Gibt einen String zurück, der dieses IPSocket-Objekt beschreibt.
Source
static VALUE
ip_peeraddr(int argc, VALUE *argv, VALUE sock)
{
union_sockaddr addr;
socklen_t len = (socklen_t)sizeof addr;
int norevlookup;
if (argc < 1 || !rsock_revlookup_flag(argv[0], &norevlookup))
norevlookup = rb_io_mode(sock) & FMODE_NOREVLOOKUP;
if (getpeername(rb_io_descriptor(sock), &addr.addr, &len) < 0)
rb_sys_fail("getpeername(2)");
return rsock_ipaddr(&addr.addr, len, norevlookup);
}
Gibt die entfernte Adresse als Array zurück, das address_family, port, hostname und numeric_address enthält. Dies ist für verbindungsorientierte Sockets wie TCPSocket definiert.
Wenn reverse_lookup true oder :hostname ist, wird der Hostname aus numeric_address durch eine Reverse-Lookup-Abfrage ermittelt. Wenn es false oder :numeric ist, ist der Hostname derselbe wie numeric_address. Wenn es nil ist oder weggelassen wird, wird ipsocket.do_not_reverse_lookup beachtet. Siehe auch Socket.getaddrinfo.
TCPSocket.open("www.ruby-lang.org", 80) {|sock| p sock.peeraddr #=> ["AF_INET", 80, "carbon.ruby-lang.org", "221.186.184.68"] p sock.peeraddr(true) #=> ["AF_INET", 80, "carbon.ruby-lang.org", "221.186.184.68"] p sock.peeraddr(false) #=> ["AF_INET", 80, "221.186.184.68", "221.186.184.68"] p sock.peeraddr(:hostname) #=> ["AF_INET", 80, "carbon.ruby-lang.org", "221.186.184.68"] p sock.peeraddr(:numeric) #=> ["AF_INET", 80, "221.186.184.68", "221.186.184.68"] }
Source
static VALUE
ip_recvfrom(int argc, VALUE *argv, VALUE sock)
{
return rsock_s_recvfrom(sock, argc, argv, RECV_IP);
}
Empfängt eine Nachricht und gibt die Nachricht als String und die Adresse zurück, von der die Nachricht stammt.
maxlen ist die maximale Anzahl der zu empfangenden Bytes.
flags sollte eine bitweise OR-Verknüpfung der Socket::MSG_* Konstanten sein.
ipaddr ist dasselbe wie IPSocket#{peeraddr,addr}.
u1 = UDPSocket.new u1.bind("127.0.0.1", 4913) u2 = UDPSocket.new u2.send "uuuu", 0, "127.0.0.1", 4913 p u1.recvfrom(10) #=> ["uuuu", ["AF_INET", 33230, "localhost", "127.0.0.1"]]