class TCPSocket
TCPSocket repräsentiert einen TCP/IP-Client-Socket.
Ein einfacher Client könnte so aussehen
require 'socket' s = TCPSocket.new 'localhost', 2000 while line = s.gets # Read lines from socket puts line # and print them end s.close # close socket when done
Öffentliche Klassenmethoden
Source
static VALUE
tcp_s_gethostbyname(VALUE obj, VALUE host)
{
rb_warn("TCPSocket.gethostbyname is deprecated; use Addrinfo.getaddrinfo instead.");
struct rb_addrinfo *res =
rsock_addrinfo(host, Qnil, AF_UNSPEC, SOCK_STREAM, AI_CANONNAME, Qnil);
return rsock_make_hostent(host, res, tcp_sockaddr);
}
Verwenden Sie stattdessen Addrinfo.getaddrinfo. Diese Methode ist aus folgenden Gründen veraltet
-
Das 3. Element des Ergebnisses ist die Adressfamilie der ersten Adresse. Die Adressfamilien der restlichen Adressen werden nicht zurückgegeben.
-
gethostbyname() kann lange dauern und andere Threads blockieren. (GVL kann nicht freigegeben werden, da gethostbyname() nicht thread-sicher ist.)
-
Diese Methode verwendet die Funktion gethostbyname(), die bereits aus POSIX entfernt wurde.
Diese Methode sucht Hostinformationen anhand des hostnamens.
TCPSocket.gethostbyname("localhost") #=> ["localhost", ["hal"], 2, "127.0.0.1"]
Source
static VALUE
tcp_init(int argc, VALUE *argv, VALUE sock)
{
VALUE remote_host, remote_serv;
VALUE local_host, local_serv;
VALUE opt;
static ID keyword_ids[5];
VALUE kwargs[5];
VALUE resolv_timeout = Qnil;
VALUE connect_timeout = Qnil;
VALUE open_timeout = Qnil;
VALUE fast_fallback = Qnil;
VALUE test_mode_settings = Qnil;
if (!keyword_ids[0]) {
CONST_ID(keyword_ids[0], "resolv_timeout");
CONST_ID(keyword_ids[1], "connect_timeout");
CONST_ID(keyword_ids[2], "open_timeout");
CONST_ID(keyword_ids[3], "fast_fallback");
CONST_ID(keyword_ids[4], "test_mode_settings");
}
rb_scan_args(argc, argv, "22:", &remote_host, &remote_serv,
&local_host, &local_serv, &opt);
if (!NIL_P(opt)) {
rb_get_kwargs(opt, keyword_ids, 0, 5, kwargs);
if (kwargs[0] != Qundef) { resolv_timeout = kwargs[0]; }
if (kwargs[1] != Qundef) { connect_timeout = kwargs[1]; }
if (kwargs[2] != Qundef) { open_timeout = kwargs[2]; }
if (kwargs[3] != Qundef) { fast_fallback = kwargs[3]; }
if (kwargs[4] != Qundef) { test_mode_settings = kwargs[4]; }
}
if (fast_fallback == Qnil) {
fast_fallback = rb_ivar_get(rb_cSocket, tcp_fast_fallback);
if (fast_fallback == Qnil) fast_fallback = Qtrue;
}
return rsock_init_inetsock(sock, remote_host, remote_serv,
local_host, local_serv, INET_CLIENT,
resolv_timeout, connect_timeout, open_timeout,
fast_fallback, test_mode_settings);
}
Öffnet eine TCP-Verbindung zu remote_host auf remote_port. Wenn local_host und local_port angegeben sind, werden diese Parameter auf der lokalen Seite verwendet, um die Verbindung herzustellen.
Ab Ruby 3.4 arbeitet diese Methode standardmäßig gemäß dem Happy Eyeballs Version 2 (RFC 8305) Algorithmus, außer unter Windows.
Details zu Happy Eyeballs Version 2 finden Sie unter Socket.tcp_fast_fallback=.
Um das gleiche Verhalten wie in Ruby 3.3 und früher zu erzielen, geben Sie explizit die Option fast_fallback:false an. Oder, wenn Sie Socket.tcp_fast_fallback=false setzen, wird Happy Eyeballs Version 2 nicht nur für diese Methode, sondern global für alle Socket deaktiviert.
Bei der Verwendung von TCPSocket.new unter Windows wird Happy Eyeballs Version 2 nicht bereitgestellt und verhält sich wie in Ruby 3.3 und früher.
- :resolv_timeout
-
Gibt das Timeout in Sekunden an, ab dem die Hostnamenauflösung beginnt.
- :connect_timeout
-
Diese Methode versucht sequenziell, Verbindungen zu allen Kandidaten-Zieladressen herzustellen.
Derconnect_timeoutgibt das Timeout in Sekunden vom Beginn des Verbindungsversuchs bis zur letzten Kandidatenadresse an.
Standardmäßig werden alle Verbindungsversuche fortgesetzt, bis das Timeout auftritt.
Wennfast_fallback:falseexplizit angegeben wird,
wird ein Timeout für jeden Verbindungsversuch festgelegt und jeder Verbindungsversuch, der sein Timeout überschreitet, wird abgebrochen. - :open_timeout
-
Gibt das Timeout in Sekunden ab dem Beginn der Methodenausführung an.
Wenn dieses Timeout erreicht wird, während noch Adressen vorhanden sind, die noch nicht versucht wurden zu verbinden, werden keine weiteren Versuche unternommen.
Wenn diese Option zusammen mit anderen Timeout-Optionen angegeben wird, wird einArgumentErrorausgelöst. - :fast_fallback
-
Aktiviert den Happy Eyeballs Version 2 Algorithmus (standardmäßig aktiviert).