-1

クライアントは最初にファイル名を送信し、サーバーはその名前のファイルを作成してデータを書き込みます。

ファイル名は、「file.txt」のような形式のコマンド引数からキャストされます。問題は、「.txt」以外のファイル名をキャストするたびにエラーが発生することです。

15% の確率で、パケット損失のある状況でコードをテストしています。損失が発生した場合、パケットの一部を残さずに、パケット全体が消えます。そのため、毎回ファイル名が失われると思っていました。ファイル名パケットが失われない場合、ファイルは適切な名前で開きます。だから私はそれが少なくとも10回ごとに適切なものを受け取ると思っていましたが、そうではありませんでした.

//send the file name to the server
byteSent = sendto(sockfd, argv[3], sizeof(argv[3]), 0,
        (struct sockaddr*)&addr, addr_size);

これらの変数には他に問題はないと思います。パケット損失が想定されていない場合、期待どおりに機能しました。3番目の引数を strlen(argv[3]) + 1 から変更しましたが、何も変わっていません。

if((byteRcvd = recvfrom(sockfd, buf, sizeof(buf), 0,
    (struct sockaddr*)&addr, &addr_size)) < 0)
    exit(1);
byteRcvd = BUFFER_SIZE;

fp = open(buf, O_RDWR | O_CREAT, 0644);
    //printf("file \"%s\" is opened\n", buf);

コードを変更することでこの問題を解決できますか?

4

1 に答える 1