2011-08-06 6 views
0

私はUDPを使って同じマシン上で構造体を送受信しようとしています。この場合、サーバとクライアントは同じマシン上で実行され、共通構造体定義(ヘッダファイルを使用)を共有します。UDPを使用して構造体を渡す

hostent構造体のDEFN(UNIXは、ビルトインタイプ):

struct hostent{ 
     char *h_name; 
     char **h_aliases; 
     int h_addrtype; 
     int h_length; 
     char **h_addr_list; 
    } 

Serverコードスニペットは、次のとおりです。

struct hostent* resolved_host = DNS_translate(DNSname); 
    if((numbytes = sendto(sockfd, (void*)&resolved_host, sizeof(struct hostent), 0, (struct sockaddr *)&client_addr, sizeof(struct sockaddr))) == -1) 
    { 
     perror("sendto failed"); 
     exit(EXIT_FAILURE); 
    } 

クライアントのコード・スニペットは、次のとおりです。

struct hostent resolved_host; 

    int addr_len = sizeof(struct sockaddr); 

    if((numbytes = recvfrom(sockfd, (void*)&resolved_host, sizeof(struct hostent), 0, (struct sockaddr *)&server_addr, &addr_len)) == -1) 
    { 
     perror("recvfrom failed"); 
     exit(EXIT_FAILURE); 
    } 

サーバが送信し、クライアントは通常通り(エラーは発生しません)受信します。 * resolved_host *構造体はサーバに格納されており、すべてのデータに問題なくアクセスできます。 しかし、クライアントで* resolved_host *構造体を使用しようとすると、seg faultが発生します。たとえば、

printf("Name : %s\n", resolved_host.h_name); 

は、segフォールトを発生させます。構造が含まれてい

答えて

2

(ただし、サーバーで動作します)ポインタ - あなたはUDPの上に構造をコピーするときにだけ値をコピーしているこれらのポインタの(すなわちのアドレスデータのいくつかの他の作品 )、実際のデータそのものではありません。

これらのポインターをサーバーで受信すると、ポインターのアドレスは他のプログラムにとって意味がありません。

+0

ああおかげで、それは完全に私の心をスキップ。私は今、愚かな気がする:| – Arun

1

ポインタを送信しています。同じマシンであっても、これらは異なるアドレス空間では有効ではありません。

3

あなたの構造体にはポインタがいっぱいです。ネットワークを介して送信すると、それらのポインターが指すデータではなく、実際のアドレスが送信されます。

これらのアドレスは、ターゲットプロセスで無効です。

自分でデータをシリアル化する必要があります。例を参照してください:

関連する問題