8byteのデータをネットワークバイトオーダーに変換することはよくあるのか？していいのか？


# やろうとしていること

C言語で構造体をtcpのソケットを用いて送受信しようとしています。  
#include <sys/stat.h>で定義がされている  
struct statをそのまま送りたいと考えていました。

# 問題点

struct statをネットワークバイトオーダー(ビッグエンディアン)に変換したいと思い、メンバ変数を一つずつ変換する処理を書いていたところでした。  
struct
statのメンバ変数にはmtime,atime,blksizeなどlong型に相当する変数が存在していまして、私のマシンは64bitなのでこれらの変数は8byteです。つまり、8byteのデータを送信する必要があるのでバイトオーダーの変換をしようとしましたが、  
バイトオーダー変換用の関数として#include
<arpa.inet.h>に含まれている関数を探すとhtonsやhtonlぐらいで2byte,4byteを変換する関数しか見つかりませんでした。自作して使っても良いのですけど、なぜ8byte用が実装されていないのでしょうか？  
32bitマシンとの通信ができないからという理由もありそうですが、そうだとしたら上記のstruct
statはそのまま変換せずに最大4byteに各メンバ変数を調整するべきということでしょうか？

# お聞きしたいこと

なぜ8byteのバイトオーダー変換は公に実装されていないのか？（あったとしても見つからない)  
そもそも32bitマシンと64bitマシンは通信することはよくあるのか？  
です。

まとまっていなくて申し訳ありませんが、もしここらへんの常識を教えていただけますなら宜しくおねがいします。




オイラなら `struct stat` をそのまま（バイナリ形式で）出力しようとはこれっぽっちも思いません。 [man
stat](https://linuxjm.osdn.jp/html/LDP_man-pages/man2/stat.2.html) によると

  * 特定メンバ `st_dev` や `st_ino` が存在すること

は決まっていますが、では

  * その具体的サイズやバイトオフセットやエンディアンネス
  * 値の意味づけ
  * 値がいつ更新されるか
  * 文書化されていないメンバの有無だの意味だの

などは決まっていません。よって `struct stat` のバイナリ内容は [linux](/questions/tagged/linux
"'linux' のタグが付いた質問を表示") 以外の OS との互換性など一切ありませんし、同一の Linux ディストリビューションであっても
x86/x64
では違うでしょうし、どうせプラットフォーム依存なのだったらバイト列をそのまま送受信してしまえばよいのでネットワークエンディアネスに変換する必然すら感じません。

ということで、そもそもその仕様間違っていませんか（案件分析ヘマってませんか）あたりから再提案することになりそうです。

で、質問に対する回答としては `ntohl()`
等が作られた当時ネットワークというのはとてつもなく高価につく代物だったのでそこに乗せる電文は最短長にしたかった、つまり１つの項目が 64bit
も使うような何かを電文に使うなど考えもしなかった（から 64bit な変換関数はその昔には作られなかった
）ということになりそうです。すでにコメントにあるように、今ならばある、ってことで。

* * *

cygwin64 と hpux の `sys/stat.h`
の中を読んでみた。この中身をネットワーク越しに別マシンに転送し、別マシン上で役に立つ気がしないので、やはり案件分析からやり直しだと判断するっス。典型的
[XY 問題](https://ja.meta.stackoverflow.com/questions/2701/)
（あるいは[こっち](https://ja.wikipedia.org/wiki/XY%E5%95%8F%E9%A1%8C)）ですね。

* * *

コメントより

> 当方学生でして、案件分析もない個人プロジェクトでした

案件分析って何か特別なことだと思ってます？報告書にしたためて上司の印もらって社内報告書データベースに永久保存する？ なわけないです。

案件分析って「やりたいこと」（開始時点では脳内でも整理されてない）に言葉という形を与えて、それを実現するのにできそうなことを探すってだけのことっス。今回オイラがやった
`struct stat` の中身を読んで検討するってのも立派に案件分析。 `st_ino` や `st_uid`
はこのマシンでのみ有効で、ネットワークの向こうのマシンにとっては同じ値でも意味が違う、という分析をすれば、これをそのままネットワーク電文に流しても意味ないと判断できます。じゃあ何をどうネットワークの向こうのマシンに渡せば意味がある？ってのはまた別の案件分析。仕様を決める＝案件分析なので、だれでも毎日やってるはずですよ。

