2012-01-10 16 views
0

クライアントからサーバーへファイルをアップロードするコードを作成する必要があります。クライアントからサーバーへソケットを介して構造体を渡す

は、クライアント側では、私は構造、

typedef struct upload_file 
{ 
char *filename; 
char *filebuffer; 
}upload_file; 

私はコマンドライン引数からファイル名を取得していますを宣言しています。

main関数では、ファイル名に構造変数を割り当てています。

upload_file.filename = argv[1]; 

は、その後、私は構造のバッファ値にそれをコピーするバッファ&に入れて、ファイルの内容を読んでいます。次のように私はソケットに構造を書いています。その後

strcpy(upld.buffer,tmp); //tmp is a buffer which will contain the file content 

write(sd, &upld, sizeof(upld)); 

この部分は、クライアント側で結構です。サーバ側では、構造全体を読み取ると&ファイルの内容をどのように分けるのですか?&ファイル名?

また、クライアント側からのバッファ値(ファイルコンテンツ)は、&とサーバ側で使用可能にできますか?

どうすればよいですか?

ありがとうございます。

答えて

3

ポインタで構造体を渡すことは無意味です。ポインタそのものは、ではなく、で送信されます。

送信するデータをマーシャリングする必要があります。さまざまなRPCメカニズム(OPC、DCEなど)が非常にうまく機能します。

あなたはないはそのような確立された方法を使用することができた場合は、基本的には、宛先バッファにターゲットをコピーし、要素によって構成要素を通過するの問題です。それは構造でだからintが直接転送されていることを

msgbuff = outbuff = malloc (
    sizeof (int) + 
    strlen (p.name) + 1 + 
    strlen (p.addr) + 1 
    ); 
if (msgbuff != NULL) { 
    *((int*)outbuff) = p.age; outbuf += sizeof (p.age); 
    strcpy (outbuff, p.name) ; outbuf += strlen (p.name) + 1; 
    strcpy (outbuff, p.addr) ; outbuf += strlen (p.addr) + 1; 
    // Send msgbuff 
    free (msgbuff); 
} else { 
    // Some error condition. 
} 

注:

struct person { 
    int age; 
    char *name; 
    char *addr; 
} p; 

あなたのような何かができる:構造と例えば

、。文字ポインタ(C文字列)では、ポインタ自体ではなく、ポインタのターゲットに到達する必要があります。

基本的に、あなたは変換:

p: age (46) 
    name (0x11111111) --> 0x11111111: "paxdiablo" 
    addr (0x22222222) --> 0x22222222: "Circle 9, Hades" 
    |--------------------|-------------------------------| 
    structure memory <- | -> other memory 

に:あなたはまた、もう一方の端に非整列化する必要がある、とあなたは注意する必要がありますので、

msgbuff (0x88888888) -> {age}{"paxdiablo"}{"Circle 9, Hades"} 

これはプロセスを少し複雑に異なるサイズのintタイプのシステムの場合しかし、それは基本的にどのように行われているのですか?

+0

データをoutbuffにシリアル化するときにp.ageにp.nameを書き込んでいませんか? – dimir

+0

'p.age'を書いた後、' outbuff + = sizeof(int) 'を追加する必要があると思います。 – ugoren

+0

はい、どちらも私はもともと年齢があったので、必要ではなかったが、潜在的なアラインメントの問題を処理するために変更しました。今修正しました。 – paxdiablo

関連する問題