Linux: Jaký je rozdíl mezi socketpair () a socket ()?


Odpověď 1:

Unixové zásuvky jsou stejně jako obousměrné FIFO. Veškerá datová komunikace však bude probíhat přes rozhraní soketů, namísto přes rozhraní souborů. Přestože jsou sokety Unix speciální souborový systém (stejně jako FIFO), nebudete používat open () a read () - budete používat socket (), bind (), recv () atd.

Například při popisu, který Unix soket chcete použít (tj. Cesta ke speciálnímu souboru, který je soket), použijete struct sockaddr_un

struct sockaddr_un {unsigned short sun_family; / * AF_UNIX * / char sun_path [108];}

Toto je struktura, kterou předáváte funkci bind (), která spojuje deskriptor soketu (deskriptor souboru) s určitým souborem (jehož název je v poli sun_path).

Socketpairs jsou normální sokety AF_UNIX, což znamená, že přes ně mohou být předávány pomocné zprávy jako SCM_RIGHTS a SCM_CREDENTIALS.

Pokud jste chtěli potrubí (), ale chtěli jste použít jediný kanál k odesílání a přijímání dat z obou stran? Protože jsou potrubí jednosměrné (s výjimkami v SYSV), nemůžete to udělat! Existuje však řešení: použijte soket domény Unix, protože mohou zpracovávat obousměrná data.

Existuje krása systémového volání známého jako socketpair (), je to dost hezké, aby se vám vrátil pár již připojených soketů

if (socketpair (AF_UNIX, SOCK_STREAM, 0, sv) == -1) {perror ("socketpair"); výstup (1); }