クライアントは最初にファイル名を送信し、サーバーはその名前のファイルを作成してデータを書き込みます。
ファイル名は、「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);
コードを変更することでこの問題を解決できますか?