5
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

ソケット通信の実装

Posted at

ソケット作成

まず、通信プロセスのためのソケットを作成します。このとき使うのは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システムコールを用います。

5
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?