0

データベースへの入力を処理するために作成した tcp サーバーを使用しています。別のLinuxサーバーにあるtcpサーバーにファイル名を送信するサーバーにtcpクライアントがあります。ファイル名が受信されると、Linux サーバーは共有フォルダーに入り、ファイルをプルしてデータベースに挿入します。

私の問題は、バッファを正しく宣言してクリアし、意味不明なものを追加したり削除したりせずに正しいファイル名を取得することです。

現在、次のように機能しています。

 char data[1024];

これは問題ありませんが、自動的にバッファを完全に削除するわけではないため、次のような「データ」に暗黙的にメモリを割り当てようとしました。

char *data = (char*) malloc(1024 * sizeof(char));
...
free(data);

また

char *data = new char[1024]; 
...
delete[] data;

何らかの理由で、上記の 2 つの宣言はサイズ =8 のバッファーを宣言しています。

sizeof(data);

また、私が受け取っているのはわずか 8 文字の長さです。なぜこれを行っているのかわかりませんが、助けはありますか??

編集

char *data = (char*)malloc(1048 * sizeof(char));
if(data==NULL) exit(1);
cout << "DATA Size: " << sizeof(data) << "\n";
int msglen = read(conn, data, sizeof(data));
cout << "Server got " << msglen << " byte message: " << data << "\n";

if(write(conn, &msglen, sizeof(msglen))<0){
    cout << "Failed to write back to the client " << strerror(errno);
}

free(data);
close(conn);
4

3 に答える 3

1

API write(int socket, char *buf, int len);

コードは次のようになります。

write(con, data, msglen);
于 2013-09-16T17:45:39.307 に答える
1

コードにはいくつか問題があります。1) malloc を使用しないでください - 質問に c++ のフラグを立てました - 必要な場合にのみ malloc を使用してください:

const int dataSize = 1024;
char *data = new char[dataSize];

2) データが char* の場合、sizeof(data) は 8 を返します。これは、データを配列 sizeof として宣言すると、配列ではなくポインターのサイズが返されるため、配列全体が占めるバイトが返されるためです。読んだものを次のように置き換える必要があります。

int msglen = read(conn,data,dataSize)

3) 受信したばかりのデータを送信者に書き込みたいと仮定します。次に
、書き込み関数で、(ほとんどの場合) 常に 4 を返す 3 番目の引数として sizeof(msglen) を指定します。sizeof( を削除します)。

write(conn, data, msglen);

データの処理が完了したら、次を使用してメモリをクリアすることを忘れないでください。

delete[] data;

delete[] でメモリを割り当てたときに常に使用しますnew[]

于 2013-09-16T17:44:57.543 に答える