dポイントプレゼントキャンペーン実施中!

char型にキャストした構造体は送れますか?
また一度にデータをまとめて送る方が良いか
逐次データを送った方、どちらが効率が良いでしょうか?

A 回答 (7件)

本題じゃないけど, ある意味重要な話:



「構造体を送信する際、送信側で定義した構造体を
受信側でも定義する必要ありますか? 」
ということですが, 「ネットワークを流れるデータ」というのは本質的にただの「ビット列」でしかなく, それをどう解釈するかについては送受信するプログラムの都合で決まります. つまり, 上の質問に対する答えは
「受信側で構造体として扱わなければならないなら必要」
となります.

この回答への補足

すいません。ソースはこちらに載せました。
http://oshiete.goo.ne.jp/qa/8429482.html

補足日時:2014/01/14 16:01
    • good
    • 0

sendtoの話がいつの間にrecvfromに?



>nRtn = recvfrom(s,(char *)&recv,(int)sizeof(szBuf)-1,0,(SOCKADDR*)&client,&clientlen)

第2引数のrecvって、もしかして

>typedef struct recv {

このrecvですか?
もしそうなら構造体の定義と(構造体)変数の定義の区別がついていないので構造体や変数について勉強し直してください。
    • good
    • 0

sendto の話なのか recvfrom の話なのかはっきりさせてほしい.



あと, そこで (char *)&recv として使っている recv の定義は?
    • good
    • 0

>の[const void *msg] で"自分で定義した構造体"から"char *"への適切な変換関数が存在しません。


>となってしまうのですが、自分で定義した構造体はどのように指定するのが良いのでしょうか?

構造体の変数をどう定義して、どのように指定してるんですか。
また、なぜ、それを書かないのでしょうか。

この回答への補足

実験的に作った構造体なので
typedef struct recv {
char Name[32];
int Flag;
} RECV;
このような形で定義してます。

nRtn = recvfrom(s,(char *)&recv,(int)sizeof(szBuf)-1,0,(SOCKADDR*)&client,&clientlen);

補足日時:2014/01/13 22:55
    • good
    • 0

構造体内の整数型などが、送受信双方でエンディアンが異なると正しく扱えない可能性があるので注意が必要です。


送信側がビッグエンディアンで、受信側がリトルエンディアンだった…とか。

>また一度にデータをまとめて送る方が良いか
>逐次データを送った方、どちらが効率が良いでしょうか?

データサイズ次第かと。
UDPで下位フレームでの分割が発生しないサイズなら一度に送信した方が手間がないかと。
# 複数受信するとか未着の可能性は残ったままですが。

この回答への補足

ssize_t sendto(int socket, const void *msg, size_t len, int flags,
const struct sockaddr *to, socklen_t tolen);

の[const void *msg] で"自分で定義した構造体"から"char *"への適切な変換関数が存在しません。
となってしまうのですが、自分で定義した構造体はどのように指定するのが良いのでしょうか?

補足日時:2014/01/13 19:08
    • good
    • 0

> 構造体を送信する際、送信側で定義した構造体を


> 受信側でも定義する必要ありますか?

当然です。
また、構造体メンバにポインタがあると、受信しても意味ないので注意。
    • good
    • 0

>char型にキャストした構造体は送れますか?



構造体のデータは送れますが、構造体をchar型にキャストというのは不可能です。

この回答への補足

構造体を送信する際、送信側で定義した構造体を
受信側でも定義する必要ありますか?

補足日時:2014/01/12 21:58
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!