ソケット作成
まず、通信プロセスのためのソケットを作成します。このとき使うのはsocketシステムコールです。
#include <sys/types.h>
#include <sys/socket.h>
int socket(int domain, int type, int protocol);
戻り値はソケットディスクリプタです。domainは通信範囲を表し、sys/socket.hで定義されている値を使用します。
ソケットタイプtypeは接続の種類を表します。これもsys/socket.hで定義されており、protocolは使用するプロトコルを指定します。
ソケット命名
作成したソケットに対して名前を付けます。この名前がクライアントが接続要求の際に指定する名前となります。このとき使われるのがbindシステムコールです。
#include <sys/types.h>
#include <sys/socket.h>
int bind(int sockfd, const struct sockaddr *name, int namelen);
sockfdには、socket()の戻り値、すなわちソケットディスクリプタを代入します。
nameはsys/socket.hで定義されているsockaddr構造体へのポインタです。この部分はソケット作成時にどのドメインを選択したかで内容が異なります。
namelenは第2引数の長さであり、sizeofでもいい。
接続準備
サーバ側
サーバは接続のための準備を行います。このとき使うのがlistenシステムコールです。
#include <sys/socket.h>
int listen(int sockfd, int backlog);
sockfdにはソケットディスクリプタを代入します。
backlogには接続要求をいくつ受け付けるかを指定できます。最大値は通常5。
クライアント側
クライアントがサーバに接続要求を出し、サーバは接続を受け入れます。
#include <sys/types.h>
#include <sys/socket.h>
int connect(int sockfd, const struct sockaddr *name, int namelen);
接続受入(サーバ側)
#include <sys/types.h>
#include <sys/socket.h>
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
戻り値は、クライアントと接続された新しいソケットディスクリプタです。以後、通信には新しいソケットディスクリプタを使用し、socketコール時の古いディスクリプタは破棄します。
通信
接続完了後は通信を行います。ストリーム型の場合、受信にreadあるいはrecv、送信にはwriteあるいはsendシステムコールを使います。
#include <sys/types.h>
#include <sys/socket.h>
int read(int sockfd, char *buf, int nbytes);
int recv(int sockfd, char *buf, int nbytes, int flags);
int write(int sockfd, char *buf, int nbytes);
int send(int sockfd, char *buf, int nbytes, int flags);
ソケットの破棄
使用しなくなったソケットを閉じるためにはcloseシステムコールを用います。