table of contents
SOCKET(2) | Linux - příručka programátora | SOCKET(2) |
JMÉNO¶
socket - vytvoř soket
POUŽITͶ
#include <sys/types.h> /* Viz POZNÁMKY */
#include <sys/socket.h>
int socket(int domain, int type, int protocol);
POPIS¶
socket() creates an endpoint for communication and returns a file descriptor that refers to that endpoint. The file descriptor returned by a successful call will be the lowest-numbered file descriptor not currently open for the process.
Parametr domain specifikuje jmenný prostor, ve kterém se bude komunikace odehrávat; tím je zvolena i rodina protokolů, které mohou být použity. Tyto rodiny jsou definovány v hlavičkovém souboru <sys/socket.h>. V současné době jsou podporovány tyto formáty:
Jméno | Účel | Man stránka |
AF_UNIX, AF_LOCAL | Lokální komunikace | unix(7) |
AF_INET | Internetové protokolu IPv4 | ip(7) |
AF_INET6 | Internetové protokolu IPv6 | ipv6(7) |
AF_IPX | Protokoly Novellu IPX | |
AF_NETLINK | Uživatelské rozhraní kernelu | netlink(7) |
AF_X25 | ITU-T X.25/ISO-8205 protokol | x25(7) |
AF_AX25 | Protokol pro Amatérskárádiova AX.25 | |
AF_ATMPVC | Access to raw ATM PVCs | |
AF_APPLETALK | AppleTalk | ddp(7) |
AF_PACKET | Paketové rozhraní nízké úrovně | packet(7) |
AF_ALG | Interface to kernel crypto API |
Soket má typ type, který specifikuje komunikační styl. Podporované typy jsou:
- SOCK_STREAM
- poskytuje sekvenční, spolehlivou a dvoustrannou proudovou komunikaci. Může být podporován mechanismus přenosu out-of-band dat.
- SOCK_DGRAM
- Podporuje datagramy (nespojované, nespolehlivé zprávy pevné (typicky malé) maximální délky).
- SOCK_SEQPACKET
- Poskytuje sekvenční, spolehlivý, dvojstranný přenos dat pro datagramy pevné maximální délky. Konzument musí přečíst celý paket při každém volání systému.
- SOCK_RAW
- Poskytuje spolehlivou datagramovou vrstvu, která však nezaručuje řazení.
- SOCK_RDM
- Provides a reliable datagram layer that does not guarantee ordering.
- SOCK_PACKET
- Zastaralé. Nemělo by být používáno v nových aplikacích. Viz packet(7).
Některé druhy soketů nemusí být implementovány pro všechny rodiny protokolů
Since Linux 2.6.27, the type argument serves a second purpose: in addition to specifying a socket type, it may include the bitwise OR of any of the following values, to modify the behavior of socket():
- SOCK_NONBLOCK
- Set the O_NONBLOCK file status flag on the new open file description. Using this flag saves extra calls to fcntl(2) to achieve the same result.
- SOCK_CLOEXEC
- Set the close-on-exec (FD_CLOEXEC) flag on the new file descriptor. See the description of the O_CLOEXEC flag in open(2) for reasons why this may be useful.
The protocol specifies a particular protocol to be used with the socket. Normally only a single protocol exists to support a particular socket type within a given protocol family, in which case protocol can be specified as 0. However, it is possible that many protocols may exist, in which case a particular protocol must be specified in this manner. The protocol number to use is specific to the “communication domain” in which communication is to take place; see protocols(5). See getprotoent(3) on how to map protocol name strings to protocol numbers.
Sockets of type SOCK_STREAM are full-duplex byte streams. They do not preserve record boundaries. A stream socket must be in a connected state before any data may be sent or received on it. A connection to another socket is created with a connect(2) call. Once connected, data may be transferred using read(2) and write(2) calls or some variant of the send(2) and recv(2) calls. When a session has been completed a close(2) may be performed. Out-of-band data may also be transmitted as described in send(2) and received as described in recv(2).
Komunikační protokoly, které implementují SOCK_STREAM zaručují, že data se neztratí a ani nebudou duplikována. Je-li část dat, pro kterou je k dispozici prostor ve vyrovnávací paměti, nedoručena po rozumnou dobu, je spojení prohlášeno za přerušené. Pokud je na soketu povoleno SO_KEEPALIVE pak soket testuje různými metodami závislými na protokolu zda je druhý konec stále aktivní. Je zaslán signál SIGPIPE pokud proces zasílá nebo přijímá data z porušeného proudu dat; pokud proces nemá obslužnou funkci pak je při přijetí tohoto signálu ukončen. Sokety SOCK_SEQPACKET mají stejnou množinu signálů jako sokety SOCK_STREAM. Jediným rozdílem je, že volání read(2) vrací pouze požadovanou velikost dat a zbylá data, která zůstala v paketu budou smazána. Zachovány jsou také meze pro příchozí datagramy.
SOCK_DGRAM and SOCK_RAW sockets allow sending of datagrams to correspondents named in sendto(2) calls. Datagrams are generally received with recvfrom(2), which returns the next datagram along with the address of its sender.
SOCK_PACKET is an obsolete socket type to receive raw packets directly from the device driver. Use packet(7) instead.
Operace fcntl(2) F_SETOWN může být použita ke specifikování procesu nebo skupiny procesů, které obdrží signál SIGURG při příchodu out-of-band dat, nebo SIGPIPE signálu, když je SOCK_STREAM spojení neočekávaně přerušeno. Může také povolit neblokující vstupně-výstupní operace případně asynchronní hlášení vstupně-výstupních událostí signálem SIGIO. Použití F_SETOWN je ekvivalentní volání ioctl(2) s parametrem FIOSETOWN nebo SIOCSPGRP.
When the network signals an error condition to the protocol module (e.g., using an ICMP message for IP) the pending error flag is set for the socket. The next operation on this socket will return the error code of the pending error. For some protocols it is possible to enable a per-socket error queue to retrieve detailed information about the error; see IP_RECVERR in ip(7).
Operace soketu jsou řízeny volbami soketů. Tyto volby jsou specifikovány v hlavičkovém souboru <sys/socket.h>. setsockopt(2) a getsockopt(2) se používají pro jejich nastavení a k získání jejich aktuálního stavu.
NÁVRATOVÉ HODNOTY¶
On success, a file descriptor for the new socket is returned. On error, -1 is returned, and errno is set appropriately.
CHYBOVÉ STAVY¶
- EACCES
- Nemáte právo vytvořit soket specifikovaného typu a/nebo protokolu.
- EAFNOSUPPORT
- The implementation does not support the specified address family.
- EINVAL
- Neznámý protokol, nebo rodina protokolů není k dispozici.
- EINVAL
- Invalid flags in type.
- EMFILE
- The per-process limit on the number of open file descriptors has been reached.
- ENFILE
- Byl dosažen limit pro absolutní počet souborů v systému.
- ENOBUFS nebo ENOMEM
- Nedostatek vyrovnávacích pamětí. Soket nemůže být vytvořen, dokud nedojde k uvolnění zdrojů.
- EPROTONOSUPPORT
- Typ protokolu nebo specifikovaný protokol není podporovaný v dané doméně.
Other errors may be generated by the underlying protocol modules.
SPLŇUJE STANDARDY¶
POSIX.1-2001, POSIX.1-2008, 4.4BSD.
The SOCK_NONBLOCK and SOCK_CLOEXEC flags are Linux-specific.
Volání jádra socket() se objevilo v 4.2BSD. Obvykle je kompatibilní s ne-BSD systémy, které podporují BSD Sokety (včetně variant Systému V).
POZNÁMKY¶
POSIX.1 nevyžaduje vložení <sys/types.h> a proto není tento hlavičkový soubor v Linuxu vyžadován. Nicméně některé starší (BSD) implementace jej vyžadují a v přenositelných aplikacích by také bylo tento hlavičkový soubor zachovat.
Konstanty používané v BSD 4.X pro rodiny protokolů jsou pojmenovány PF_UNIX, PF_INET zatímco adresové rodiny jsou pojmenované AF_UNIX, AF_INET, atd. Nicméně BSD man stránky tvrdí, že adresové a protokolové rodiny jsou to samé, a že je možné používat předponu AF_* všude.
The AF_ALG protocol type was added in Linux 2.6.38. More information on this interface is provided with the kernel HTML documentation at https://www.kernel.org/doc/htmldocs/crypto-API/User.html.
PŘÍKLAD¶
Příklad použití funkce socket() je v getaddrinfo(3).
DALŠÍ INFORMACE¶
accept(2), bind(2), close(2), connect(2), fcntl(2), getpeername(2), getsockname(2), getsockopt(2), ioctl(2), listen(2), read(2), recv(2), select(2), send(2), shutdown(2), socketpair(2), write(2), getprotoent(3), ip(7), socket(7), tcp(7), udp(7), unix(7)
“An Introductory 4.3BSD Interprocess Communication Tutorial” and “BSD Interprocess Communication Tutorial”, reprinted in UNIX Programmer's Supplementary Documents Volume 1.
TIRÁ޶
Tato stránka je součástí projektu Linux man-pages v4.16. Popis projektu a informace o hlášení chyb najdete na https://www.kernel.org/doc/man-pages/.
PŘEKLAD¶
Překlad této příručky do španělštiny vytvořili Pavel Heimlich <tropikhajma@gmail.com>
Tento překlad je bezplatná dokumentace; Přečtěte si GNU General Public License Version 3 nebo novější ohledně podmínek autorských práv. Neexistuje ŽÁDNÁ ODPOVĚDNOST.
Pokud narazíte na nějaké chyby v překladu této příručky, pošlete e-mail na adresu translation-team-cs@lists.sourceforge.net.
15. září 2017 | Linux |