HULFT 技術者が押さえておきたい Linux システムコール

HULFTは、TCPを使用して通信を行っています。
本記事では、TCPに関連するLinux システムコールの一部を紹介します。
 
各システムコールの説明は、下記の通りです。

1. サーバ側

 

1.1 socket()


通信を待ち受けるソケット(リスニングソケット)を生成します。

入力      IPv4/v6
TCP/UDP/ICMP
その他
出力(成功)
出力(失敗)
sockfd: ソケットのディスクリプター(通信の識別子 他通信と区別するための背番号)
-1
主なエラー EACCES
ENFILE
ENOBUFS
ENOMEM
 

1.2 bind()


「ソケット」と「自ホスト側ポート番号等の情報」を紐づけます。

入力      sockfd - socket()で生成したリスニングソケットのディスクリプター
(自ホストのIP, 自ホストのポート番号等がセットされた)構造体
その他
出力(成功)
出力(失敗)
0
-1
主なエラー EACCES
EADDRINUSE
EBADF
EINVAL
 

1.3 listen()


他ホスト(クライアント)からの通信受付可能とします。

入力      ssockfd - socket()で生成したリスニングソケットのディスクリプター
backlog(バッファの大きさ)
出力(成功)
出力(失敗)
0
-1
主なエラー EADDRINUSE
EBADF
ENOTSOCK
 

1.4 accept()


listenされたソケットのバックログから、通信が確立(ESTABLISH)したソケットを受け取る。

入力      sockfd - socket()で生成したリスニングソケットのディスクリプター
接続したクライアントの情報を保存するアドレス
出力(成功)
出力(失敗)
sockfd - クライアントと接続済の新しいソケットのディスクリプター
-1
主なエラー EAGAIN
EWOULDBLOCK
ECONNABORTED
EINTR
EINVAL
EMFILE
ENOBUFS
ENOMEM
EPERM
 

1.5 send()


データを送信します。

入力      sockfd - accept()で取得したソケットのディスクリプター
送信する情報を保存するアドレス
その他
出力(成功)
出力(失敗)
0
-1
主なエラー EAGAIN
EWOULDBLOCK
ECONNRESET
EINTR
EINVAL
EISCONN
ENOBUFS
ENOMEM
EPIPE
 

1.6 recv()


データを受信します。

入力      sockfd - accept()で取得したソケットのディスクリプター
受信する情報を保存するアドレス
出力(成功)
出力(失敗)
0
-1
主なエラー EAGAIN
EWOULDBLOCK
ECONNRESET
EFAULT
EINTR
EINVAL
EISCONN
ENOBUFS
ENOMEM
EPIPE
 

1.7 close()


通信を終了します。

入力      sockfd - accept()で取得したソケットのディスクリプター
その他
出力(成功)
出力(失敗)
0
-1
主なエラー EBADF
EINTR
EIO

2. クライアント側

 

2.1 socket()


ソケット生成します。

入力      IPv4/v6
TCP/UDP/ICMP
その他
出力(成功)
出力(失敗)
sockfd: ソケットのディスクリプター(通信の識別子 他通信と区別するための背番号)
-1
主なエラー EACCES
ENFILE
ENOBUFS
ENOMEM
 

2.2 connect()


サーバへの通信を開始します。

入力      sockfd - socket()で生成したソケットのディスクリプター
(サーバ側のIP, サーバ側のポート番号等がセットされた)構造体
その他
出力(成功)
出力(失敗)
0
-1
主なエラー EACCESUNIX
EACCES
EPERM
EADDRINUSE
EADDRNOTAVAIL
EAGAIN
EBADF
ECONNREFUSED
EFAULT
EINTR
EISCONN
ENETUNREACH
ETIMEDOUT
 

2.3 recv()


データを受信します。

入力      sockfd - socket()で生成したソケットのディスクリプター
受信する情報を保存するアドレス
出力(成功)
出力(失敗)
0
-1
主なエラー EAGAIN
EWOULDBLOCK
ECONNRESET
EFAULT
EINTR
EINVAL
EISCONN
ENOBUFS
ENOMEM
EPIPE
 

2.4 send()


データを送信します。

入力      sockfd - socket()で生成したソケットのディスクリプター
送信する情報を保存するアドレス
その他
出力(成功)
出力(失敗)
0
-1
主なエラー EAGAIN
EWOULDBLOCK
ECONNRESET
EINTR
EINVAL
EISCONN
ENOBUFS
ENOMEM
EPIPE
 

2.5 close()


通信を終了します。

入力      ssockfd - socket()で生成したソケットのディスクリプター
その他
出力(成功)
出力(失敗)
0
-1
主なエラー EBADF
EINTR
EIO

お問合せ