【ソケット通信】ネットワークバイトオーダと recv の戻り値

 

C言語のソケット通信プログラムの続き。固定長文字列の送受信まで昨日成功していたので、shot int(16bit) や int(32bit) ,long(64bit) など、ネットワークバイトオーダが問題となるデータを送受信するサンプルを今日動かした。

 

が。簡単だと思ってやってみると、嵌った。原因は2つ。

特定の値(例えば-1111)がくるまで送受信を続ける、という仕様で作っていた。

が。特定の値を受け取るまで、受信データを表示せず、特定の値を受け取ると、ループを抜けるはずが無限に特定の値を表示し続ける、という不具合になった。

 

ループの終了条件を受信データの値で行っていた。

if( dataEnd == buf ) break;

 

この時、バッファの値はネットワークバイトオーダ(ビックエンディアン)なので、元データにするんは

int16_t data = ntohs(buf);

と変換してから、dataEnd と比較する。

しかし。これでは不十分らしい。ループを抜けなかった。

recv() の戻り値をチェックしたところ、無事にループを抜けた。

int16_t なデータを送受信したので、受信データのサイズは 2が正解。

たまたま終了データとして選んだ -1111を受信すると、データサイズが0になるようだった。

なぜそうなるのかは不明。なので、

int rcv_len = recv( sd, &buf, sizeof(int16_t), 0);

if( rcv_len != 2) break;

 

とすると、無限ループを抜けることができた。