構造体データの送信

[戻る]
ショコレ 2004/12/24(金) 01:59:18
いつもお世話になっています、C言語初心者のものです。

Visual C++でTCP/IPの勉強をしているんですけど

send関数でデータを送信する時に,char型の配列ではなくて

構造体にセットしたデータを送る場合、どのようにしたら良いでしょうか?

例)
send(CliSock, (char *)構造体, 1026, 0 )

上みたいにchar型にキャストして、一応の送信は出来るんですが

送ったデータがおかしなものになってしまいます。

また構造体の内容を,char型の配列に移し変えようともしたんですけど

これもダメでした。

どなたかよろしくおねがいします。

Ban 2004/12/24(金) 03:43:52
まず、どんな環境からどんなデータをどのように送った時、
どんな環境でどのように受信したらどんなデータになったか。
この辺りの情報を整理して提示してください。

バイナリの送受信は、コンパイラの設定に影響を受けることも
考えられますが、送信側も受信側も同一バージョンの VC を
使っているということですか?

あちらで指摘されたように、単にキャスト時にポインタと本体を
混同してるのか、データのバイトオーダなのか、パディングなのか、
メンバにポインタを含んでいて送信側のアドレスを送っているのか、
...もっと他のバグなのか。

その構造体がそのままシリアライズできるのかも不明、
具体的にどうダメだったのかも不明では、現物を見ていない
あなた以外の人には可能性がありすぎて絞りきれません。


# ちなみに「マルチポスト」を検索してみると分かりますが、
# 複数の掲示板に同一の質問をする行為は、マナー違反と見られて
# 回答者の心証を悪くすることがあります。
# 多くの回答者はたいていどちらも見てますし、ほとんど反応を
# 悪くする効果しかありませんので、止めておいた方が無難かと思います。

KING・王 2004/12/24(金) 08:12:39
TCP/IPを用いた、異なるOS間でのデータ通信をおこなった経験から一言。

構造体のアライメントは、大丈夫でしょうか?
また、エンディアンの問題は?

以前のWindowsと他のOSとの通信を行った際に、アライメント関係で問題があり、
構造体を1バイトアライメント(#pragma pack(1))で使用した経験があります。

このあたりも確認するために、パケットアナライザ(キャプチャ?)などで、
実際に通信されているTCP/IPのパケットの内容を確認してみましょう。

アイススケーター 2004/12/24(金) 15:07:53
構造体のアドレス指定がおかしいのではないでしょうか
変数定義とソース部を公開して下さい。

Ban 2004/12/24(金) 16:04:30
# 「VC++超初心者会議室」さんの方で
# 「12540 構造体のデータの送信」レスが伸びてます。
# (ご本人からの反応はまだないようです)

古いスレッドには追加発言できません。