客户端首先发送文件名,服务器用该名称创建一个文件以将数据写入其中。
文件名是从命令参数转换而来的,格式类似于“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);
我猜这些变量没有任何其他问题。当不假设丢包时,它按我预期的方式工作。我从 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);
我可以通过修改代码来解决这个问题吗?