Linux: Каква е разликата между socketpair () и socket ()?


Отговор 1:

Unix гнездата са точно като двупосочни FIFO. Въпреки това, цялата комуникация с данни ще се осъществява чрез интерфейса на сокетите, вместо чрез файловия интерфейс. Въпреки че Unix сокетите са специален файл във файловата система (точно като FIFO), няма да използвате open () и read () - ще използвате socket (), bind (), recv () и т.н.

Например, когато описвате кой Unix сокет искате да използвате (тоест пътят към специалния файл, който е сокета), използвате struct sockaddr_un

struct sockaddr_un {неподписан кратък sun_family; / * AF_UNIX * / char sun_path [108];}

Това е структурата, която ще преминете към функцията bind (), която свързва дескриптор на сокета (дескриптор на файл) с определен файл (името за което е в полето sun_path).

Socketpairs са нормални гнезда AF_UNIX, което означава, че над тях могат да се предават спомагателни съобщения като SCM_RIGHTS и SCM_CREDENTIALS.

Ако искате тръба (), но искате да използвате една тръба за изпращане и получаване на данни от двете страни? Тъй като тръбите са еднопосочни (с изключения в SYSV), не можете да го направите! Въпреки това има решение: използвайте Unix домейн сокет, тъй като те могат да обработват двупосочни данни.

Има красота на системния разговор, известен като socketpair (), това е достатъчно хубаво, за да ви върне чифт вече свързани гнезда

if (socketpair (AF_UNIX, SOCK_STREAM, 0, sv) == -1) {perror ("socketpair"); изход (1); }