class UNIXServer
UNIXServer repräsentiert einen UNIX-Domain-Stream-Server-Socket.
Öffentliche Klassenmethoden
Source
static VALUE
unix_svr_init(VALUE sock, VALUE path)
{
return rsock_init_unixsock(sock, path, 1);
}
Erstellt einen neuen UNIX-Server-Socket, der an path gebunden ist.
require 'socket' serv = UNIXServer.new("/tmp/sock") s = serv.accept p s.read
Öffentliche Instanzmethoden
Source
static VALUE
unix_accept(VALUE server)
{
struct sockaddr_un buffer;
socklen_t length = sizeof(buffer);
return rsock_s_accept(rb_cUNIXSocket, server, (struct sockaddr*)&buffer, &length);
}
Akzeptiert eine eingehende Verbindung. Gibt ein neues UNIXSocket-Objekt zurück.
UNIXServer.open("/tmp/sock") {|serv| UNIXSocket.open("/tmp/sock") {|c| s = serv.accept s.puts "hi" s.close p c.read #=> "hi\n" } }
Source
# File ext/socket/lib/socket.rb, line 1818 def accept_nonblock(exception: true) __accept_nonblock(exception) end
Akzeptiert eine eingehende Verbindung mit accept(2), nachdem O_NONBLOCK für den zugrunde liegenden Dateideskriptor gesetzt wurde. Gibt ein akzeptiertes UNIXSocket für die eingehende Verbindung zurück.
Beispiel
require 'socket' serv = UNIXServer.new("/tmp/sock") begin # emulate blocking accept sock = serv.accept_nonblock rescue IO::WaitReadable, Errno::EINTR IO.select([serv]) retry end # sock is an accepted socket.
Siehe Socket#accept für die Ausnahmen, die ausgelöst werden können, wenn der Aufruf von UNIXServer#accept_nonblock fehlschlägt.
UNIXServer#accept_nonblock kann jede Ausnahme auslösen, die einem accept(2)-Fehler entspricht, einschließlich Errno::EWOULDBLOCK.
Wenn die Ausnahme Errno::EWOULDBLOCK, Errno::EAGAIN, Errno::ECONNABORTED oder Errno::EPROTO ist, wird sie von IO::WaitReadable erweitert. Daher kann IO::WaitReadable verwendet werden, um die Ausnahmen für das erneute Versuchen von accept_nonblock abzufangen.
Durch Angabe eines Schlüsselwortarguments exception auf false können Sie angeben, dass accept_nonblock keine IO::WaitReadable-Ausnahme auslösen, sondern das Symbol :wait_readable zurückgeben soll.
Siehe
Source
VALUE
rsock_sock_listen(VALUE sock, VALUE log)
{
rb_io_t *fptr;
int backlog;
backlog = NUM2INT(log);
GetOpenFile(sock, fptr);
if (listen(fptr->fd, backlog) < 0)
rb_sys_fail("listen(2)");
return INT2FIX(0);
}
Wartet auf Verbindungen und verwendet die angegebene int als Backlog. Ein Aufruf von listen gilt nur, wenn der socket vom Typ SOCK_STREAM oder SOCK_SEQPACKET ist.
Parameter
-
backlog- die maximale Länge der Warteschlange für ausstehende Verbindungen.
Beispiel 1
require 'socket' include Socket::Constants socket = Socket.new( AF_INET, SOCK_STREAM, 0 ) sockaddr = Socket.pack_sockaddr_in( 2200, 'localhost' ) socket.bind( sockaddr ) socket.listen( 5 )
Beispiel 2 (lauscht auf einem beliebigen Port, nur Unix-basierte Systeme)
require 'socket' include Socket::Constants socket = Socket.new( AF_INET, SOCK_STREAM, 0 ) socket.listen( 1 )
Unix-basierte Ausnahmen
Auf Unix-basierten Systemen funktioniert dies, da eine neue sockaddr-Struktur für die Adresse ADDR_ANY für eine beliebige Portnummer erstellt wird, die vom Kernel zugewiesen wird. Unter Windows funktioniert dies nicht, da unter Windows der socket durch Aufruf von bind gebunden sein muss, bevor er listen kann.
Wenn die backlog-Menge die implementierungsabhängige maximale Warteschlangenlänge überschreitet, wird die maximale Warteschlangenlänge der Implementierung verwendet.
Auf Unix-basierten Systemen können die folgenden Systemausnahmen ausgelöst werden, wenn der Aufruf von listen fehlschlägt
-
Errno::EBADF - das socket-Argument ist kein gültiger Dateideskriptor
-
Errno::EDESTADDRREQ - der socket ist nicht an eine lokale Adresse gebunden, und das Protokoll unterstützt kein Lauschen auf einem ungebundenen Socket
-
Errno::EINVAL - der socket ist bereits verbunden
-
Errno::ENOTSOCK - das socket-Argument bezieht sich nicht auf einen Socket
-
Errno::EOPNOTSUPP - das socket-Protokoll unterstützt listen nicht
-
Errno::EACCES - der aufrufende Prozess hat keine geeigneten Berechtigungen
-
Errno::EINVAL - der socket wurde heruntergefahren
-
Errno::ENOBUFS - es stehen nicht genügend Systemressourcen zur Verfügung, um den Aufruf abzuschließen
Windows-Ausnahmen
Auf Windows-Systemen können die folgenden Systemausnahmen ausgelöst werden, wenn der Aufruf von listen fehlschlägt
-
Errno::ENETDOWN - das Netzwerk ist ausgefallen
-
Errno::EADDRINUSE - die lokale Adresse des Sockets ist bereits in Verwendung. Dies tritt normalerweise während der Ausführung von bind auf, kann aber verzögert werden, wenn der Aufruf von bind an eine teilweise Wildcard-Adresse (einschließlich ADDR_ANY) erfolgte und eine bestimmte Adresse zum Zeitpunkt des Aufrufs von listen zugewiesen werden muss.
-
Errno::EINPROGRESS - ein Windows Sockets 1.1-Aufruf ist in Bearbeitung oder der Dienstanbieter verarbeitet noch eine Callback-Funktion.
-
Errno::EINVAL - der
socketwurde nicht mit einem Aufruf von bind gebunden. -
Errno::EISCONN - der
socketist bereits verbunden -
Errno::EMFILE - keine Socket-Deskriptoren mehr verfügbar.
-
Errno::ENOBUFS - kein Pufferplatz verfügbar
-
Errno::ENOTSOC -
socketist kein Socket. -
Errno::EOPNOTSUPP - der referenzierte
socketist kein Typ, der die listen-Methode unterstützt.
Siehe
-
listen-Manpages auf Unix-basierten Systemen.
-
listen-Funktion in der Microsoft Winsock-Funktionsreferenz.
Source
static VALUE
unix_sysaccept(VALUE server)
{
struct sockaddr_un buffer;
socklen_t length = sizeof(buffer);
return rsock_s_accept(0, server, (struct sockaddr*)&buffer, &length);
}
Akzeptiert eine neue Verbindung. Gibt den neuen Dateideskriptor zurück, der eine ganze Zahl ist.
UNIXServer.open("/tmp/sock") {|serv| UNIXSocket.open("/tmp/sock") {|c| fd = serv.sysaccept s = IO.new(fd) s.puts "hi" s.close p c.read #=> "hi\n" } }