サーバーからクライアントにファイルを転送するプログラムを実装したいと考えています。私はデータの読み書きに読み書き機能を使用しなければなりません。ここにサーバーとクライアントのコードを示します。ソケットを介してファイルを転送する
server.c
char buffer[512];
if((file = open(strTable[1], O_RDONLY)) == -1) { perror("Open"); }
while(read(file, buffer, sizeof(buffer)) != 0)
{
size = strlen(buffer)+1;
if(write(newsock, &size, sizeof(size)) < 0) { perror("Write"); exit(1); }
write_all(newsock, buffer, strlen(buffer)+1);
}
size = 4;
if(write(newsock, &size, sizeof(size)) < 0) { perror("Write"); exit(1); }
write_all(newsock, "end", 4);
これ開きstrTable [1](私は読んしたいファイルが含まれている)、それははsizeof(バッファ)バイトを読み込み、私はどのくらいのバイト私はクライアントに送信ソケットに書き込み、その後バイトを送信します。ここにwrite_all関数があります。
int write_all(int sock, char* buffer, int size)
{
int nwrite, sent = 0;
while(sent < size)
{
if((nwrite = write(sock, buffer + sent, size - sent)) < 0)
{ perror("Write"); exit(1); }
sent += nwrite;
}
return sent;
}
いるclient.cは
if((file = open(absolute, O_WRONLY | O_CREAT | O_TRUNC, 0644)) == -1)
{ perror("Open"); }
while(true)
{
received = 0;
/* Read the desired readable size */
if(read(sock, &size, sizeof(size)) < 0)
{ perror("Read"); pthread_exit(NULL); }
/* Read all data */
while(received < size)
{
if((nread = read(sock, buffer + received, size - received)) < 0)
{ perror("Read"); pthread_exit(NULL); }
received += nread;
}
if(strncmp(buffer, "end", 4) == 0) { break; }
write_all(file, buffer, strlen(buffer)+1);
}
クライアントファイル(絶対)を開き、それを読み込む何それに書き込みます。それは最初にどのくらいの大きさの読み込みが必要なのかを読み取ってから、そのサイズに達するまで読み込みを停止します。クライアントが "end"を読み取ると、サーバーはソケットへの書き込みを停止して、クライアントが読み取りを停止します。
問題は、転送後にファイルを開くことができないということです。私は開いていないいくつかの画像を読んでいます。私はまた、いくつかのランダムな言葉を書く1つのfile.txtを読んで、これはコピーされているようだが、それはあまりにも(その写真番号2)いくつかのゴミを持っています。なぜ私はこれを取得し、どのように私はソケットからファイルを正しく転送できますか?
[タグ:エンコーディング]の関連性が私を逃れます。 – EJP
'read'と' write'はどちらも、読み書きされたバイト数のカウントを返します。要求されたバイト数より少なくなる可能性があります。 –