ソケット(英: Socket,通信端点[1][2])とは、BSD系UNIXを起源とするAPIであり、C言語によるアプリケーション開発でのプロセス間通信、特にコンピュータネットワークに関するライブラリを構成する。その起源を強調してBSDソケット、バークレーソケットなどとも呼ばれる。
1983年にリリースされたUNIXオペレーティングシステム (OS) 4.2BSD で初めて API として実装された。ネットワークの抽象化インタフェースとしてのデファクトスタンダードとなっている。伝統的なSocket APIはC言語を対象とするが、他のプログラミング言語でも類似のインタフェースを用意している事が多い。
ソケットの代替となるAPIとして、STREAMSベースの Transport Layer Interface (TLI) がある。しかし、BSDソケットは比較にならないほど普及しており、数多くの実装が存在する。 BSDソケットは、ホスト間の通信や1つのコンピュータ上のプロセス間の通信を可能とする。通信媒体としては様々な入出力機器やデバイスドライバを利用可能だが、その部分はオペレーティングシステムの実装に依存する。このインタフェース実装はTCP/IPを利用する際にはほとんどの場合で必要とされ、インターネットを支える基盤技術の一つとなっている。当初、カリフォルニア大学バークレー校でUNIX向けに開発された。最近の全てのオペレーティングシステムには間違いなくBSDソケットが何らかの形で実装されており、インターネットへの接続の標準インタフェースとなっている。 プログラマの観点から見ると、ソケットインタフェースは3つのレベルでアクセス可能である。最も強力で基本的なレベルは RAW(生)ソケットレベルである。RAWソケットが可能とする通信制御の自由度を必要とするアプリケーションは稀であり、インターネット関連技術の開発でのみ使われるべきとされている。 BSDソケットにはいくつかのヘッダファイルがある。 TCP はコネクションの概念を提供する。TCPソケットを生成するには socket() 関数で AF_INET または AF_INET6 と SOCK_STREAM を引数に指定する。 単純なTCPサーバの設定は、以下のように行われる。
目次
1 BSDソケットインタフェース
2 ヘッダファイル
3 TCP
3.1 サーバ
3.2 クライアント
4 UDP
4.1 サーバ
4.2 クライアント
5 UNIXドメインソケット
6 関数
6.1 socket()
6.2 gethostbyname() と gethostbyaddr()
6.3 connect()
6.4 bind()
6.5 listen()
6.6 accept()
7 ブロッキングとノンブロッキング
8 注意点
9 参考文献
10 脚註
10.1 出典
11 関連項目
12 外部リンク
BSDソケットインタフェース
ヘッダファイル
<sys/socket.h>
BSDソケットの中核となる関数とデータ構造
<netinet/in.h>
AF_INET と AF_INET6 アドレスファミリ。インターネット上で広く使われ、IPアドレスとTCP/UDPのポート番号が含まれる。
<sys/un.h>
AF_UNIX アドレスファミリ。同一コンピュータ上で動作するプログラム間のローカルな通信に使用。ネットワーク上では使われない。
<arpa/inet.h>
数値としてIPアドレスを操作する機能の定義
<netdb.h>
プロトコル名とホスト名を数値アドレスに変換する機能の定義。ローカルなデータやDNSを検索する。
TCP
サーバ
TCPソケットを生成(socket()呼び出し)
そのソケットを listen(コネクション確立要求待ち受け)ポートにバインド(bind()呼び出し)。bind() を呼び出す前に、sockaddr_in 構造体を宣言し、その中身をクリアし(bzero() または memset())、その sin_family フィールドを AF_INET か AF_INET6 に設定し、sin_port フィールドに listen 対象ポート番号をネットワークバイトオーダで設定する。short int をネットワークバイトオーダに変換するには、htons() 関数を使う。
そのソケットをコネクションの listen に使用するため、listen() を呼び出す。
入ってきたコネクションを accept() 呼び出しで受け付ける。これはコネクションが受信されるまでブロックし、受信したコネクションのソケット記述子を返す。最初の記述子は listen 用記述子のままであり、accept() はそのソケットをクローズするまで何度でも呼び出せる。
遠隔のホストと通信を行う。send()とrecv()、またはwrite()とread()を使用する。
不要になったら、close() を使ってオープンされた各ソケットをクローズする。
Size:28 KB
出典: フリー百科事典『ウィキペディア(Wikipedia)』
担当:undef