私は「ソケット」という用語がUnix / Linux環境で2つの異なる意味を持つことができることを知っています。
- Unixソケット; 2つ以上のプロセス間のインタフェース。
- IPソケット。プロセスと1つ以上の通信サービス(またはマシン)との間のインターフェース。
一般的な定義はこれら2つをまとめたものですか、それとも私たちの文脈でより多くの「ソケット」がありますか?
答え1
http://man7.org/linux/man-pages/man2/socket.2.html
int socket(int domain, int type, int protocol);
説明する
socket()
通信エンドポイントを作成し、エンドポイントを参照するファイル記述子を返します。成功した呼び出しによって返されたファイル記述子は、現在プロセスに対して開かれていない最も低い番号のファイル記述子になります。
domainパラメーターは通信ドメインを指定し、これは通信に使用されるプロトコルシリーズを選択します。これらのファミリは <sys/socket.h> で定義されています。現在理解されている形式は次のとおりです。
Name Purpose Man page
AF_UNIX, AF_LOCAL Local communication unix(7)
AF_INET IPv4 Internet protocols ip(7)
AF_INET6 IPv6 Internet protocols ipv6(7)
AF_IPX IPX - Novell protocols
AF_NETLINK Kernel user interface device netlink(7)
AF_X25 ITU-T X.25 / ISO-8208 protocol x25(7)
AF_AX25 Amateur radio AX.25 protocol
AF_ATMPVC Access to raw ATM PVCs
AF_APPLETALK AppleTalk ddp(7)
AF_PACKET Low level packet interface packet(7)
AF_ALG Interface to kernel crypto API
...
上記のリストは包括的ではありません。他のものの1つはAF_BLUETOOTH
:-)です。
ソケットは呼び出して開くsendmsg()
ことrecvmsg()
ができるものです。メッセージはソケットアドレスに送信されるか、ソケットアドレスで受信されます。
詳細はありますが、ソケットの種類によって異なります。たとえば -
SOCK_STREAM
ソケットは実際にメッセージに興味がありません。これは、Unixパイプに対応する双方向などのバイトストリームを送信します。何も失うことなく使用しwrite()
て電話できます。read()
(いわゆる「帯域外」データは除外されます。廃止そして主に使用されますtelnet
。 )
接続指向ソケットタイプ(付属)の場合、SOCK_STREAM
各ソケットは1つのピアアドレスとのみデータを送受信できます。詳細設定を使用する必要がありますconnect()
。または、相手がbind()
メッセージを受信するのではなく、受信できる特定のアドレスに送信してください。ソケット。つまり、コールでリスニングを開始し、ソケットを返すコールlisten()
でaccept()
各接続を受信します。
型はSOCK_SEQPACKET
接続指向(信頼できる順次配信)として定義されますが、そうでない場合は標準内でも定義が衝突します。。そしてSCTP接続を受けることもできますいいえaccept()
上記の呼び出しを使用してください。したがって、プロトコルを使用している場合は、SOCK_SEQPACKET
その意味についてあまり想定しないでください。使用している特定のプロトコルの実装に関する情報を見つけます。