ステップ3:データ送信・受信
ソケットの接続ができれば、サーバとのデータ送信や受信ができるようになり ます。送信にはファイル出力に使うwrite()システムコールを、受信 にはファイル入力に使うread()を使って実現できます。
システムコール:read()
第一引数socketの返値であるソケット番号です。第二引数 bufは受信したデータを格納するための領域であり、第三引数 lengthは一回のread()の実行で受信するデータのバイトに なります。このため、第二引数bufはlengthバイト以上の 領域でなければいけません。システムコールread()の返値は実際に 受信したデータのバイト数となります。ここで、返値は第三引数 lengthより小さくなることに注意してください。これは第三引数 lengthバイト分を受信しようとしたのに、サーバ側からの送信デー タ量はlengthより小さく、返値分のバイト数しかなかった場合です。 なお、受信に失敗した場合は-1を返します。
システムコール:write()
次に write()システムコールについて説明します。 write()はファイルへの出力をする システムコールであり、通信ではソケットへの送信のために使われます。
第一引数socketはソケット番号です。第二引数bufは送信 すべきデータを格納してある領域であり、第三引数lengthは送信デー タのバイト数を与えます。なお、第二引数buf領域サイズは lengthより大きくなければいけません。ステムコール write()の返値は実際に送信できたデータのバイト数となります。こ こで、返値は第三引数lengthより小さくなることに注意してくださ い。これは第三引数lengthバイト分を送信しようとしたのに、サー バ側がlength以下のバイト数しか受信しなかった場合です。なお、 送信に失敗した場合は-1を返します。
プログラムリストではsend_input(int sockfd)においてキーボー ドから入力された文字をサーバに送信します。
ステップ4:ソケットのクローズ
ファイル入出力では入出力処理が終了したらオープンしたファイルを クローズします。これと同様に、ソケットも通信が終了したらクローズ しなければいけません。
システムコール:close()
ソケットのクローズはファイルのクローズ と同じシステムコール、つまりclose()を利用します。
引数はクローズするソケットの番号を指定します。 クローズに失敗した場合は-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以外にも利用され、その種類によってアドレスの指定・ 解釈方法が違うのです。
ソケットの接続ができれば、サーバとのデータ送信や受信ができるようになり ます。送信にはファイル出力に使う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以外にも利用され、その種類によってアドレスの指定・ 解釈方法が違うのです。