c - C:通过 TCP 服务器和客户端套接字的文件传输不完整
问题描述
我在通过 C 中的 TCP 套接字传输文件时遇到问题。我将文件以 8192 字节的小块从服务器发送到客户端。问题是客户不完整地收到前一个,并且根本没有收到最后一个。
这是代码的两个相关部分。服务器:
fd = open(filename,O_RDONLY);
if (fd == -1)
{
fprintf(stderr, "Error opening file --> %s", strerror(errno));
exit(EXIT_FAILURE);
}
/* Get file stats */
if (fstat(fd, &file_stat) < 0)
{
fprintf(stderr, "Error fstat --> %s", strerror(errno));
exit(EXIT_FAILURE);
}
fprintf(stdout, "File Size: \n%d bytes\n", file_stat.st_size);
sprintf(file_size, "%d", file_stat.st_size);
/* Sending file size */
len = send(peer_socket, file_size, sizeof(file_size), 0);
if (len < 0)
{
fprintf(stderr, "Error on sending greetings --> %s", strerror(errno));
exit(EXIT_FAILURE);
}
fprintf(stdout, "Server sent %d bytes for the size\n", len);
offset = 0;
remain_data = file_stat.st_size;
/* Sending file data */
while(((sent_bytes = sendfile(peer_socket, fd,&offset, BUFSIZ))>0)&&(remain_data > 0))
{
remain_data -= sent_bytes;
fprintf(stdout, "2. Server sent %d bytes from file's data, offset is now : %d and remaining data = %d\n", sent_bytes, offset, remain_data);
}
和客户端:
ecv(client_socket, buffer, BUFSIZ, 0);
file_size = atoi(buffer);
fprintf(stdout, "\nFile size : %d\n", file_size);
//received_file = fclose(fopen(FILENAME, "w"));
received_file = fopen(FILENAME, "w");
if (received_file == NULL)
{
fprintf(stderr, "Failed to open file --> %s\n", strerror(errno));
exit(EXIT_FAILURE);
}
remain_data = file_size;
while ((remain_data > 0)&&((len = recv(client_socket, buffer, BUFSIZ, 0)) > 0))
{
fwrite(buffer, sizeof(char), len, received_file);
remain_data -= len;
//if (remain_data < BUFSIZ)
// buffsize = remain_data;
//bzero(buffer,BUFSIZ);
//if (len == 0 || len != BUFSIZ)
// break;
fprintf(stdout, "Received %d bytes , %d bytes remaining\n", len, remain_data);
}
//code for accelerator here
fclose(received_file);
从那里开始,双方的应用程序都被永远卡住了。知道什么可能导致麻烦吗?感谢您的回答
解决方案
推荐阅读
- nuxt.js - 从页面中提取 AsyncData
- python - 如何在没有 `` 的情况下使用 Alter Table 获得值?
- javascript - 将外部 Javascript 文件添加到从 codepen 导出的 Html 代码
- office365 - 如何在 Power Apps 中单击按钮时将库中多个文本输入的内容通过电子邮件发送给指定用户?
- git - 我可以将我的 git repo 的位置从我的项目的子目录移动到这个项目的主目录,而不会丢失 GitHub 上的历史记录吗?
- javascript - 单击时使用 jquery 更改 css 不会恢复对象的原始 css
- apache-spark - pyspark 数据帧日期时间格式转换,同时从 csv 文件加载而不指定列名
- python - 如何将整数列表拆分为数字整数列表?
- php - 在 Wordpress 中使用 AJAX 表单上传文件错误 - 指定文件上传测试失败
- generator - 通过 ImageDataGenerator 将数据导入 tensorflow 自动编码器