基本TCPソケット
ネットワークI/Oを行うためには、socket関数を呼び出す
#include <sys/socket.h> int socket(int family, int type, int protocol);
socket関数に使用するプロトコルファミリ
type | 説明 |
AF_INET | IPv4プロトコル |
AF_INET6 | IPv6プロトコル |
AF_LOCAL | Unixドメインソケット |
AF_ROUTE | 経路制御ソケット |
AF_KEY | キーソケット |
socket関数に使用するソケットの型
type | 説明 |
SOCK_STREAM | ストリームソケット |
SOCK_DGRAM | データグラムソケット |
SOCK_RAW | rawソケット |
connect関数
connect関数は、TCPクライアントがTCPサーバーとのコネクションを確立するために用いられる。
#include <sys/socket.h> int connect(int sockfd, const struct sockaddr *servaddr, socklen_t addrlen); 戻り値:成功なら0、エラーなら-1
sockfdは、socket関数が返したソケットディスクリプタ
クライアントは、connect関数より先に、bind関数を呼び出さなくてよい。カーネルが必要に応じて短命ポートと始点IPアドレスの両方を選択する。
connect関数の呼び出しは、TCPの 3 Way Hand Shake を起動する。
connect関数がエラーになる場合
ETIMEOUTが返される。
bind関数
bind関数は、ソケットにローカルなプロトコルアドレスをバインドする。
#include <sys/socket.h> int bind(int sockfd, struct sockaddr *myaddr, socklen_t addrlen); 戻り値:成功なら0, エラーなら-1
TCPではbind呼び出し時に、ポート番号とIPアドレスの両方を指定することができるし、全く指定しないこともできる。
myaddrのポート番号に0が指定されていた場合、bindの呼び出し時にカーネルが短命ポートを選択する。
ワイルドカードIPアドレスが指定された場合、カーネルはソケットが接続されるまで(TCP)、あるいはソケットを通してデータグラムが送信されるまで(UDP)ローカルIPアドレスを選択しない。
IPv4では、ワイルドカードアドレスは、通常ゼロの値を持つ INADDR_ANY定数で指定し、この値を用いてカーネルにIPアドレスを選択するように指示する。
例
struct sockaddr_in servaddr; servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
bindが返す典型的なエラーにEADDRINUSE(Address already in use - アドレスは既に使用されている)がある。
参考文献
基本TCPソケット2
listen関数
listen関数は、TCPサーバーのみが呼び出す関数
1.socket関数で作成されたソケットはアクティブソケット、すなわちconnectの対象となるクライアントソケットであると見なされる。listen関数は、接続していないソケットをパッシブソケット、すなわちソケットへのコネクション要求をカーネルが受ける状態へ変換する。
2. 第2引数で指定された、このソケットに対するカーネル内のコネクションキューの最大長を設定する。
Kpre>
#include
int listen(int sockfd, int backlog);
戻り値:成功なら0、エラーなら-1
各リスニングソケットに対してカーネル内に次の2種類のキューがある。
各クライアントから到着したSYNに対応し、TCPの3WHSの完了待ちエントリが含まれるキュー。これらのソケットは、SYN_RCVD状態にある。
TCPの3WHSが完了した各クライアントに対応するエントリが含まれるキュー。これらのソケットは、ESTABLISHED状態にある。
参考文献