送信を利用した構造物recvfrom()で送()
-
22-07-2019 - |
質問
を使用してい C言語 である 共通プラットフォーム 両方のサーバとクライアント
い構造の特定のタイプしたいクライアントに送信するか、サーバーにコピーします。
用例
サーバーコード
//necessary declarations
struct hostent *hp;
hp=gethostbyname("www.google.com");
sendto(sockDes,&hp,sizeof(hp),0,(struct sockaddr *)&cli_addr,sizeof(cli_addr));
クライアントコード
struct hostent *hp;
msg=recvfrom(mysock,&hp,sizeof(hp),0,(struct sockaddr)&serv_addr,&size_len);
なので、基本的に送信したい構造からサーバーするサービスです。だから、上記のコードを取得していますの区分断層、いかなえるかどうかわからないかな構造の転送が可能です。がなくなります。
解決
最初に、struct hostentにメモリを割り当てるためにmalloc()する必要があります。 sendto()/ recvfrom()を介して構造体を転送できますが、構造体hostentにはポインターが含まれているため、ポインターであるこの構造体のメンバーは、相手側に転送されるとすぐに意味を持ちません。
他のヒント
&を削除しますhpの前
一般置する譲渡原構造のネットワークない限り、具体的に使うために設計されていたネットワークによる輸送、またはいない場合の必要なくその両端は常に同じです。の違いおよびパディングのバイト順序の原因となり、データが文字化けをしています。特定のタイプのstructチャレンジしているうちに移動できません送られている原の回答によるスペトロス)
の問題を送信コードがこのhpはポインタまたは処理のようで、データポイントです。sizeof(hp)サイズを返しますポインタではなく、サイズの指摘をhostent struct.また、作成するポインタをポインタを引数の送することを意味するものではなく。の送信コードを読む:
struct hostent *hp;
hp=gethostbyname("www.google.com");
sendto(sockDes,hp,sizeof(*hp),0,(struct sockaddr *)&cli_addr,sizeof(cli_addr));
あるかもしれませんの課題を受けます。すると、空間を割り当てのためのrecvfromしたデータです。ませんので配分のメールが届きました。変更届コードのこれら二つの:
// Store on the stack
struct hostent h;
msg=recvfrom(mysock,&h,sizeof(h),0,(struct sockaddr)&serv_addr,&size_len);
または
// Store on the heap, be sure to free() when done
struct hostent * hp = malloc(sizeof(struct hostent));
msg=recvfrom(mysock,hp,sizeof(*hp),0,(struct sockaddr)&serv_addr,&size_len);
hpがポインターである場合、なぜそのアドレスを取っているのですか?
次のようにコードを修正する必要があります。
struct hostent *p_hp = gethostbyname("www.google.com");
struct sockaddr_in cli_addr;
sendto(sockDes,p_hp,sizeof(hostent),0,(SOCKADDR *)&cli_addr,sizeof(cli_addr));
struct hostent hp;
struct sockaddr_in serv_addr;
int size_serv_addr = sizeof(serv_addr);
msg=recvfrom(mysock,&hp,sizeof(hostent),0,(SOCKADDR *)&serv_addr,&size_serv_addr);
ソケット関数に関するドキュメントを読むと常に役立ちます。
ところで、あなたの投稿で非常に一般的な質問、つまり「サーバーからクライアントに構造を送信したい」を検討する場合、SOの次の投稿を参照することをお勧めします: