ステップ3:データ送信・受信

ソケットの接続ができれば、サーバとのデータ送信や受信ができるようになり ます。送信にはファイル出力に使うwrite()システムコールを、受信 にはファイル入力に使うread()を使って実現できます。

システムコール:read()


int read(int scoket, char *buf, int length)


第一引数socketの返値であるソケット番号です。第二引数 bufは受信したデータを格納するための領域であり、第三引数 lengthは一回のread()の実行で受信するデータのバイトに なります。このため、第二引数bufはlengthバイト以上の 領域でなければいけません。システムコールread()の返値は実際に 受信したデータのバイト数となります。ここで、返値は第三引数 lengthより小さくなることに注意してください。これは第三引数 lengthバイト分を受信しようとしたのに、サーバ側からの送信デー タ量はlengthより小さく、返値分のバイト数しかなかった場合です。 なお、受信に失敗した場合は-1を返します。

システムコール:write()

次に write()システムコールについて説明します。 write()はファイルへの出力をする システムコールであり、通信ではソケットへの送信のために使われます。


int write(int scoket, char *buf, int length)


第一引数socketはソケット番号です。第二引数bufは送信 すべきデータを格納してある領域であり、第三引数lengthは送信デー タのバイト数を与えます。なお、第二引数buf領域サイズは lengthより大きくなければいけません。ステムコール write()の返値は実際に送信できたデータのバイト数となります。こ こで、返値は第三引数lengthより小さくなることに注意してくださ い。これは第三引数lengthバイト分を送信しようとしたのに、サー バ側がlength以下のバイト数しか受信しなかった場合です。なお、 送信に失敗した場合は-1を返します。

プログラムリストではsend_input(int sockfd)においてキーボー ドから入力された文字をサーバに送信します。


void send_input(int sockfd) {

char buf[128];

int buf_len;

while(1){

buf_len = read(0, buf, 1);

write(sockfd, buf, buf_len);

}

}


ステップ4:ソケットのクローズ

ファイル入出力では入出力処理が終了したらオープンしたファイルを クローズします。これと同様に、ソケットも通信が終了したらクローズ しなければいけません。

システムコール:close()

ソケットのクローズはファイルのクローズ と同じシステムコール、つまりclose()を利用します。


int close(int sockfd)


引数はクローズするソケットの番号を指定します。 クローズに失敗した場合は-1を返します。

コラム:バイト順序

htons()関数はバイト順序(の解説は未完)を変換する。

関数 機能
unsigned short htons(unsigned short) コンピュータに依存した形式のshort型の整数を ネットワーク共通の形式のshort型の整数に変換
unsigned long htons(unsigned long) コンピュータに依存した形式のlong型の整数を ネットワーク共通の形式のlong型の整数に変換
unsigned short ntons(unsigned short) ネットワーク共通の形式のshort型の整数を コンピュータに依存した形式のshort型の整数に変換
unsigned long ntons(unsigned long) ネットワーク共通の形式のlong型の整数を コンピュータに依存した形式のlong型の整数に変換

コラム:バイト操作

ネットワークにおける文字列の終わりは、C言語の文字列の終わりとは 一致するとは限りません。このため、通常の文字列関数では

関数 機能
bcopy(char *src, char *dst, int bytes) bytesバイト分の srcの内容を dstにコピーする。
bzero() ゼロで埋める
bcmp()

コラム:プロトコルファミリー

プロトコルファミリーは、これはサーバアドレスが与えられたときにどのよう に解釈するかを決めるものです。ソケットという概念を利用する通信は、イン ターネットなどのTCP/IP以外にも利用され、その種類によってアドレスの指定・ 解釈方法が違うのです。