2012-02-28 3 views
0

ので、イムは、両側に構造を定義した:のmemcpy()修正クライアントソケットファイルディスクリプタクライアントとの間でserver.I構造を送信しようと

struct msg { 
    char name[50]; 
    char time[50]; 
    int len; 
    char buf[200]; 
} 

問題がserver.cで発生します。私はすでにこの行で問題を見つけた:

struct msg s1; 
char buffer_input[1024]={0};// the buffer stream for sending 
...// omitted all sorts of initializations cuz they all passed my debug and tests 
memset(buffer_input,0,sizeof(buffer_input)); 
memcpy(buffer_input,&s1,sizeof(s1)); 
/* Originally, the send() call read: */ 
/* ssize_t size=send(client_sock,(struct sockaddr*)&client_sock_address,&addrlen); */ 
ssize_t size=send(client_sock,buffer_input,sizeof(buffer_input),0); 
if(size<0) perror("send()"); 

は、標準出力に、私が持っている:

send() : Socket operations on non-socket object 

をので、私はmemcpy(buffer_input,&s1,sizeof(s1))が原因である可能性がありますことを予感しています。だから、コードを次のように変更しました。

memset(buffer_input,0,sizeof(buffer_input)); 
strcpy(buffer_input,"example"); 

send()は完全に機能し、正しい形式でメッセージを受け取りました。

一連のデバッグ後、memcpy(...)の後に、クライアントソケットのファイル記述子が0から8に変わったことに気付きました。

ライン

ssize_t size=send(client_sock,(struct sockaddr*)&client_sock_address,&addrlen); 

ssize_t size=send(client_sock, buffer_input, 1024); 

それともbuffer_inputを取り除くと持っを読む必要がありますので、私は..

+0

あなたは正確にあなたが誰かの答えは、コードに誤りがあることを示唆している時に、質問を編集する必要はありませんので、トラブルの原因となるコードをコピーしたことを確認してください。それは誰にとっても難しいことです。 –

+1

's1'とは何ですか? 'sizeof(s1)'とは何ですか?それに直面して、 'sizeof(s1)> sizeof(buffer_input)'と 'memcpy()'は境界を越えて踏みにじっていて、それが踏んだビットの1つがあなたのファイルディスクリプタです。 'assert(sizeof(s1)<= sizeof(buffer_input));' assertをいくつか追加してください。それが発生すると、物事を修正します。また、 'stderr'ではなく' stderr'に 'perror()'のメッセージが表示されますが、違いは見つけにくいです。アサーションが発生しなければ、あなたの 'あらゆる種類の初期化を省略しました'というコードはおそらく代わりに問題を引き起こしています。頻繁に行って、client_sockを印刷してください。 –

答えて

1

をソケットのファイルディスクリプタを変更memcpyどのケースでできた、不思議

ssize_t size=send(client_sock, &s1, sizeof(s1)); 

(!あなたも、同様のmemsetのものを削除することができます)

EDIT

いくつかのより多くのコーヒーの後は、ここではより良いソリューションです:

/* 50 + 100 + 100 + 4 */ 
#define BUFFER_LENGTH 254 

... 

unsigned char buffer[BUFFER_LENGTH]; 

... 

memcpy(buffer, s1.name, 50); 
memcpy(buffer + 50, s1.time, 50); 
uint32_t net_len = htonl(s1.len); 
memcpy(buffer + 100, &net_len, 4); 
memcpy(buffer + 104, ss1.buf, 100); 

... 

ssize_t size=send(client_sock, buffer, BUFFER_LEN); 
+0

私が編集した私のpost.itは、私は()この場合 – jasonkim

+0

で正確であるといただきました多くのを、私は送信が()、それはバッファストリームを送り出す方法として、構造を送るサポートしている場合は知らないdid.sendいくつかの入力ミスだった – jasonkim

+1

@ y26jin - ポインタを持たないので、この方法で構造体を送信することができます。唯一の問題は2台のマシンの終わりかもしれませんが、簡潔さのためにOPが 'memcpy'で使用されたので、私は問題の2台のマシンが同じendinessであると仮定します。 sendはxmitに一連のバイトを必要とします。 –

2

memcpyでは、いけません任意の状況、ファイル記述子を変更します。あなたはそれを我々が持っている情報(s1あなたはbufferを可能に1000年よりもはるかに少ない約300バイト、でなければなりません)与えられた可能性は低いと思われる不正なパラメータを与える場合

何それこと行う上書きメモリであることがあります。

あなたのバッファがあなたの構造にとって小さすぎる可能性は、そのコードが本当にあなたが持っているものであれば(文字列とシーケンスの両方で、関数の入力や終了を含めて)低いと思われます。

私が示唆できるのは、デバッグコードです。

あなたがmemcpy、出力は次の値を呼び出す前に、行う必要があります。

  • sizeof(buffer)
  • &buffer
  • sizeof (s1)
  • &s1
  • client_sock
  • &client_sock。コールの後に再びそれらを

次に出力。それに基づいて、我々はmemcpy呼び出しによって破損を検出する(または破棄する可能性がある)ことができるはずです。

関連する問題