ソケット関連関数その他のリファレンス

‐Contents‐

ソケット関連関数

ソケットの作成(socket)

TCP通信を行うためには、まずソケットを作成する必要がある。ソケットはsocket関数を使って作成する。

socket関数は次のように定義されている。

#include<sys/socket.h>
int s=socket(int af,int type,int protocol);

各パラメーターの意味は次の通り。

afアドレスファミリ。
IPv4はAF_INET。IPv6はAF_INET6。両対応はAF_UNSPEC。
type通信プロトコル。
SOCK_STREAM: TCP , SOCK_DGRAM: UDP
protocol通常は0。
戻り値成功の場合はソケット。失敗の場合は-1。

アドレス情報を結び付ける(bind)

socket関数で作成されたソケットに、サーバーのIPアドレスおよびポート番号を結び付けるのがbind関数である。bind関数は、ADDRINFO構造体でこれらの情報を受け取る。

まず、ADDRINFO構造体を以下に示す。

[ADDRINFO構造体]
struct addrinfo{
  int              ai_family;
  struct sockaddr* ai_addr;
  int              ai_socktype;
  int              ai_protocol;
  int              ai_flags;
  socklen_t        ai_addrlen;
  char*            ai_canonname;
  struct addrinfo* ai_next;
};
typedef addrinfo ADDRINFO;
ai_family (アドレスファミリ)
ai_addr (IPアドレス(IPv4,IPv6))
ai_socktype (SOCK_STREAM, SOCK_DGRAM)
ai_protocol (IPPROTO_{TCP|UDP}または0)
ai_flags (AI.PASSIVE, AI_CANONNAME, AI_NUMERICHOST)
ai_addrlen (アドレスの長さ)
ai_canonname (ホストの別名)
ai_next (次のアドレスの構造体)

bind関数は次のように定義されている。

#include<sys/socket.h>
int bind(int s,struct sockaddr *name,int namelen);

各パラメーターの意味は次の通り。

sソケット。
nameサーバーのアドレス情報。
namelenai_addr構造体の大きさ。
戻り値成功の場合は0。失敗の場合は-1。

リクエストの受信待機(listen)

listen関数はリクエストの受信待機する関数である。接続要求のあったリクエストは、サーバーによって接続が確立されるまで待機状態になるが、listen関数はこの待機状態になっているリクエストを管理する。

listen関数は次のように定義されている。

#include<sys/socket.h>
int listen(int s,int backlog);

各パラメーターの意味は次の通り。

sソケット。
backlog待機状態のリクエストが格納されるキューの大きさ。
戻り値成功の場合は0。失敗の場合は-1。

接続を確立する(accept)

accept関数は接続待ちのリクエストを1つ取り出し、接続を確立する関数である。接続を確立すると、新しいソケットが作成される。クライアントとの通信は、この新しいソケットを使って行う。

accept関数は次のように定義されている。

#include<sys/socket.h>
SOCKET t=accept(int s,struct sockaddr *addr,int *addrlen);

各パラメーターの意味は次の通り。

sソケット。
addr接続先のアドレス情報。
addrlenai_addr構造体の大きさ。
戻り値成功の場合は新しいソケット。失敗の場合は-1。

ソケットを閉じる(close)

close関数は通信を切断してソケットを閉じる。

close関数は次のように定義されている。

#include<sys/socket.h>
int close(int s);

パラメーターの意味は次の通り。

戻り値成功の場合は0。失敗の場合は-1。

なお、Windowsにおける同様の関数は、closesocket関数である。

接続要求を出して接続する(connect)

connect関数はサーバーに接続を要求を出して接続を確立する。

connect関数は次のように定義されている。

#include<sys/socket.h>
int connect(int s,const struct sockaddr *name,int namelen);

各パラメーターの意味は次の通り。

sソケット
name接続先のアドレス情報。
namelenai_addr構造体の大きさ。
戻り値成功の場合は0。失敗の場合は-1。

データを送信する(send)

サーバーではaccept関数により接続されたソケットが作成され、クライアントではconnect関数によって接続されたソケットが作成される。 send関数およびrecv関数は、接続が確立されたソケットを通してデータを送受信するための関数である。

send関数は次のように定義されている。

#include<sys/socket.h>
int send(int s,void *buf,int len,int flags);

各パラメーターの意味は次の通り。

sソケット。
buf送信バッファへのポインタ。
len送信バッファの大きさ。
flags通常は0。
戻り値成功の場合は送信したデータ長(バイト)。失敗の場合は-1。

データを受信する(recv)

データを受信を行うのがrecv関数である。

recv関数は次のように定義されている。

#include<sys/socket.h>
int recv(int s,void *buf,int len,int flags);

各パラメーターの意味は次の通り。

sソケット。
buf受信バッファへのポインタ。
len受信バッファの大きさ。
flags通常は0。
戻り値成功の場合は受信したデータ長(バイト)。ソケットが閉じられた場合は0。失敗の場合は-1。

その他

ホスト名やサービス名を変換する(getaddrinfo)

ホスト名とIPアドレスの変換や、サービス名とポート番号の変換を行うのがgetaddrinfo関数である。

getaddrinfo関数は次のように定義されている。

#include<sys/socket.h>
int getaddrinfo(char *node,char *service,struct addrinfo *hints,struct addrinfo **res);

各パラメーターの意味は次の通り。

nodeホスト名またはIPアドレス。
serviceサービス名またはポート番号。
histsADDRINFO構造体。
resADDRINFO構造体へのポインタ。

なお、現在のインターネットでは、IPv4およびIPv6それぞれに依存したアプリケーションを作らないために、gethostbynameやgethostbyaddrなどではなく、getaddrinfoを使用することが強く推奨されている。

不要になったアドレス情報を開放する(freeaddrinfo)

freeaddrinfo関数は、getaddrinfo関数で取得したアドレス情報を格納するために使用していた領域を解放するための関数である。

freeaddrinfo関数は次のように定義されている。

#include<sys/socket.h>
int freeaddrinfo(struct addrinfo *res);

パラメーターの意味は次の通り。

resADDRINFO構造体。

送受信を多重化する(select)

TCP通信において送受信を多重化するのがselect関数である。

select関数は次のように定義されている。

#include<sys/time.h>
#include<unistd.h>
int select(int n,int readfds,int writefds,int exceptfds,struct timeval timeout);

各パラメーターの意味は次の通り。

nファイルディスクプリタの最大数。
readfds受信ファイルディスクプリタ。
writefds送信ファイルディスクプリタ。
exceptfds通常はNULL。
timeoutselect関数を停止する時間。

なお、select関数による送受信の多重化は本来はあまり推奨されない。実際には、スレッドによって実現する方が望ましい。

[ Back ]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2008-12-19 (金) 11:13:28 (3924d)