おもちゃのクライアント/サーバー アプリを作成し、UDP ストリーム経由でデータを送信しています。「テスト」などの小さなメッセージを送信すると、すべてがうまく機能します。しかし、ファイルを転送しようとすると、あまりにも多くのデータを転送しているようです。
転送するファイルのサイズは 4k 弱です (少なくとも ls コマンドによると)。しかし、sendto 操作が完了すると、確認メッセージに、正確に 5000 バイト (バッファーの最大サイズ) を送信したことが示されます。
UDP はメッセージを順不同で転送する可能性があるため、必要がなければ sendto を分割したくありません。私が間違っていることを誰かが見ていますか?の使用に関係していると思いますが、必要sizeof(buffer)
なバイト数を正確に転送する方法がわかりません。ありがとうございました!
これがコードの関連部分です。さらに必要な場合はお知らせください:
char buffer[5000];
char path[] = "myfile";
FILE* fp;
if ((fp = fopen(path, "rb")) == NULL) {
printf(stdout, "Error opening the file: %s\n", strerror(errno));
exit(1);
}
memset(&buffer[0], 0, sizeof(buffer));
do {
fread(buffer, 1, MAXBUFSIZE, fp);
} while (!feof(fp));
if ( (numbytes = sendto(sockfd, buffer, sizeof(buffer), 0,
(struct sockaddr *)&server_addr, sizeof(server_addr))) < 0)
{
perror("send error");
}
fprintf(stderr, "client sent %d bytes to server\n", numbytes);