Scroll to navigation

SOCKET(2) Linux - příručka programátora SOCKET(2)

JMÉNO

socket - vytvoř soket

SYNTAXE

#include <sys/types.h> /*Viz POZNÁMKY*/
#include <sys/socket.h>

int socket(int domain, int type, int protocol);

POPIS

Socket vytvoří soket a vrátí jeho deskriptor.

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 Přístup k ATM PVC
AF_APPLETALK Appletalk ddp(7)
AF_PACKET paketové rozhraní nízké úrovně packet(7)

Soket má typ type, který specifikuje komunikační styl. Podporované typy jsou:

poskytuje sekvenční, spolehlivou a dvoustrannou proudovou komunikaci. Může být podporován mechanismus přenosu out-of-band dat.
Podporuje datagramy (nespojované, nespolehlivé zprávy pevné (typicky malé) maximální délky).
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.
Poskytuje spolehlivou datagramovou vrstvu, která však nezaručuje řazení.
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ů. Například SOCK_SEQPACKET není implementováno pro AF_INET.

Argument protocol specifikuje, který konkrétní protokol má být použit. Normálně existuje pouze jeden protokol, který se dá použít u soketu konkrétního typu a dané rodiny protokolů. Ale je samozřejmě možné, aby existovalo protokolů více. Číslo protokolu závisí na použitém jmenném prostoru, bližší informace naleznete v protocols(5).

Sokety typu SOCK_STREAM jsou plně duplexní proudy dat podobné rourám. Proudový soket musí být spojen před tím, než přijme nebo pošle jakákoliv data. Spojení s jiným soketem se provádí voláním connect(2). Jestliže bylo spojení navázáno, mohou být přenášena data pomocí volání read(2) a write(2) nebo některou variantou volání send(2) a recv(2). Je-li sezení ukončeno, můžete zavolat funkci close(2). Out-of-band data mohou být poslána. Konkrétní informace najdete v send(2). Out-of-band data mohou být přijata voláním 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 a SOCK_RAW Poskytuje přístup k interním síťovým protokolům a rozhraním.

sokety povolují posílání paketů adresátům specifikovaným ve volání send(2). Datagramy jsou obvykle přijímány pomocí volání recvfrom(2), které vrací další datagram s jeho návratovou adresou.

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.

Pokud síť signalizuje chybu protokolovému modulu (například pomocí ICMP zprávy pro IP protokol) je soketu přiřazen příznak značící nevyřešenou chybu. Další operace na tomto soketu obnoví tento příznak. Pro některé protokoly je možné zřídit frontu chyb pro každý soket a získat tak detailní informace o chybách. Viz IP_RECVERR v 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Á HODNOTA

-1 je vrácena, jestliže nastala chyba, jinak je vrácen deskriptor soketu.

CHYBY

Nemáte právo vytvořit soket specifikovaného typu a/nebo protokolu.
Komunikační styl nebo protokol není podporován specifikovaným jmenným prostorem.
Neznámý protokol, nebo rodina protokolů není k dispozici.
Tabulka deskriptorů procesu je zaplněna.
Tabulka otevřených souborů systému je zaplněna.
Nedostatek vyrovnávacích pamětí. Soket nemůže být vytvořen, dokud nedojde k uvolnění zdrojů.
Typ protokolu nebo specifikovaný protokol není podporovaný v dané doméně.

SPLŇUJE STANDARDY

4.4BSD, POSIX.1-2001 (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-2001 nevyžaduje vložení hlavičkového souboru <sys/types.h> a tento soubor není vyžadován ani v linuxu. Nicméně některé starší BSD implementace jej vyžadují a proto je doporučeno jej vložit do přenositelných aplikací.

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, 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.

CHYBY V IMPLEMENTACI

SOCK_UUCP ještě není implementováno

PŘÍKLAD

Příklad použití funkce socket() je v getaddrinfo(3).

DALŠÍ INFORMACE

accept(2), bind(2), connect(2), fnctl(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.3 BSD Interprocess Communication Tutorial" je znovu vydáno v UNIX Programmer's Supplementary Documents Volume 1

"BSD Interprocess Communication Tutorial" je znovu vydáno v UNIX Programmer's Supplementary Documents Volume 1

TIRÁŽ

Tato stránka je součástí projektu Linux man-pages. Popis projektu a informace o hlášení chyb najdete na http://www.kernel.org/doc/man-pages/.

6. listopadu 2009 BSD Man Page