2009-08-04 16 views
3

共通プラットフォームをサーバーとクライアントの両方に使用しています。recvfrom()とsendto()を使用した送信構造

私はサーバーからクライアントに送信する特定のタイプの構造を持っています。

サーバコード

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

だから、基本的に私は、サーバからクライアントへの構造を送りたいです。しかし、上記のコードから、私はセグメンテーション違反を得ています。そのような構造移転が実現可能かどうかはわかりません。脱出はありますか?

+0

それは多かれ少なかれです。私はそれをどんな方法でも移植性と呼んでいない。 – Skurmedel

答えて

6

まず、struct hostentのメモリを割り当てるためにmalloc()を実行する必要があります。 structをsendto()/ recvfrom()で転送することはできますが、struct hostentにはポインタが含まれているため、ポインタであるこのstructのメンバーは、他端に転送されるとすぐに意味を持ちません。

+1

良いキャッチ!私はsegfaultの原因を探していて、彼が転送しようとしていたものについては考えていませんでした。 –

+1

Ok ..構造体hostentを送信することは重要ではありません。構造体ストリングの内容をストリングでサーバーに送信する方が良いでしょう。 –

+2

これは間違いなく、通常そうです。あなたは本当に注意しない限り、ネットワーク上で文字や整数以外のものを送信したくないのです。また、整数を送信する場合は、htonl/htons/ntohl/ntohsファンクションファミリを使用して整数をネットワークバイトオーダーに/から変換するようにしてください。 –

4

私はHPがポインタである場合は、なぜあなたはそのアドレスを取っているHP

1

の前で&を削除するだろうか?

4

一般的に、ネットワーク転送として使用するように特別に設計されている場合を除いて、または両端が常に完全に同じアーキテクチャになることを絶対に確かめる場合を除いて、パディングとバイトオーダリングの違いにより、データが反対側で文字化けして表示されることがあります。あなたが送信しようとしている特定のタイプの構造体は生のまま送信されません。(ペトロスの答えを参照してください)

送信コードの問題は、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のためのスペースを割り当てることになっています。それはあなたのためにそれを割り当てていません。あなたの受信コードは、これら二つのいずれかに変更します。

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

それはいつものドキュメントを読むために役立つだろうソケット関数。

0

ところで、あなたの投稿に非常に一般的な質問、「私は、サーバからクライアントに構造を送りたい」、私はSO上で次の記事を見てお勧めします:

Passing a structure through Sockets in C

関連する問題