3

サーバーとクライアントの両方に共通のプラットフォームである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);

つまり、基本的にはサーバーからクライアントに構造を送信したいと思います。しかし、上記のコードからセグメンテーション違反が発生しており、そのような構造転送が実行可能かどうかはわかりません。抜け道はありますか?

4

6 に答える 6

6

まず、構造体ホストにメモリを割り当てるために、malloc()を実行する必要があります。sendto()/ recvfrom()を介して構造体を転送できますが、構造体hostentにはポインターが含まれているため、ポインターであるこの構造体のメンバーは、もう一方の端に転送されるとすぐには意味がありません。

于 2009-08-04T19:25:26.673 に答える
4

hpの前の&を削除します

于 2009-08-04T19:06:11.673 に答える
4

一般に、ネットワークトランスポートとして使用するように特別に設計されていない限り、または両端が常に完全に同じアーキテクチャであることが絶対に確実でない限り、生の構造をネットワーク経由で転送することは避けたいと考えています。パディングとバイト順序の違いにより、データが反対側で文字化けして表示される場合があります。転送しようとしている特定のタイプの構造体は、生で送信しても機能しません(Petrosによる回答を参照)

送信コードの問題は、hpがポインターであり、それが指すデータであるかのように扱っていることです。sizeof(hp)は、指定されたhostent構造体のサイズではなく、ポインターのサイズを返します。また、意図しない場合は、sendtoの2番目の引数にポインターからポインターを作成しています。送信コードは次のようになります。

struct hostent *hp;

hp=gethostbyname("www.google.com");

sendto(sockDes,hp,sizeof(*hp),0,(struct sockaddr *)&cli_addr,sizeof(cli_addr));

受信コードにも問題があります。受信したデータを格納するために、recvfromにスペースを割り当てることになっています。それはあなたのためにそれを割り当てません。受信コードを次の2つのいずれかに変更します。

// 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);
于 2009-08-04T19:11:09.353 に答える
1

hpがポインターである場合、なぜそのアドレスを取得するのですか?

于 2009-08-04T19:08:02.417 に答える
1

以下に示すようにコードを修正する必要があります。

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);

ソケット機能に関するドキュメントを読むことは常に役に立ちます。

于 2009-08-04T19:24:23.867 に答える
0

ちなみに、あなたの投稿で非常に一般的な質問、つまり「サーバーからクライアントに構造を送信したい」を検討する場合は、SOに関する次の投稿を参照することをお勧めします。

Cのソケットを介して構造体を渡す

于 2013-10-29T19:28:39.463 に答える