通过套接字传输文件,最终大小较少字节

2023-11-25

我正在尝试通过 C 中的套接字接收一些文件。但是服务器向我发送了 1000000 字节文件的 64 字节数据包,并且我在目标文件上获得了大约 999902 字节。

while ((n = read(sd, buffer_in, BUFSIZE ))) //  BUFSIZE = 64 
{
    if(n<0)
    {
       printf("Fail.\n");
       fclose(archivo);
       return -1;
    }

    if(fwrite(buffer_in, n, 1, f) !=1 ) 
    { 
       printf("fwrite error.\n");
       fclose(archivo);
       return -1;
    }

    bytes+=n;
}

printf("We received %d bytes",  bytes);

当通过本地 TCP/IP 套接字使用时,它可以工作,但不能在慢速连接中使用。通过调试我发现我得到了很多 64 字节的块,以及 EOF 附近的 30 字节的块。我知道您可以在 read() 上获得更少的字节,因为当任何数据(> 1 字节)可用时调用都会返回。但这种情况应该暂时不能捕获吧?当 n == 0 时应该返回,即没有更多数据(EOF)。

谢谢你的帮助。

(EDIT)

发送代码如下:

while (n=read(file_fd, buffer, BUFSIZE))
{
   write (sdaccept, buffer, n)
}

我知道 read() 和 write() 都可能返回 N

(编辑二)

使用 10673 字节的 C 源进行测试,接收 10575 没有损坏,除了目标文件缺少前 98 个字节!


提供的发送代码忽略了套接字上的 write() (或 send() )不必写入整个缓冲区的事实。

如果底层子系统拒绝接收更多数据(例如网络子系统可能有一个用于发送数据的队列,并且该队列已经满),则 write()/send() 可能会决定部分写入或根本不写入。在连接速度较慢的情况下,这种情况很有可能发生。

发送端应检查 write() 的返回值,以检测实际写入了多少数据并进行相应调整。

写入应该像这样完成:

int readAmount;
while( readAmount = read(file_fd, buffer, BUFSIZE) > 0 )
{
    int totalWritten = 0;
    do {
       int actualWritten;
       actualWritten = write (sdaccept, buffer + totalWritten, readAmount - totalWritten);
       if( actualWritten == - 1 ) {
           //some error occured - quit;
       }
       totalWritten += actualWritten;
    } while( totalWritten < readAmount );
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

通过套接字传输文件,最终大小较少字节 的相关文章

随机推荐

  • 从 Promise 返回一个值

    我想使用这样的 Promise 调用 Google Maps Geocoding API function makeGeoCodingRequest address bounds Input parameters address a str
  • ICollection.包含自定义类型

    如果我有一个 参考 这重要吗 类型MyType这不会覆盖Equals方法 在确定是否存在时将使用什么启发式方法ICollection包含该类型的给定实例 使用我自己的启发法的最佳方法是什么 例如检查Id适当的价值 由于您的类型不会覆盖 Eq
  • 在 SQL Server 中定义一对一关系

    我需要定义一对一的关系 但似乎无法在 SQL Server 中找到正确的方法 您问为什么是一对一的关系 我使用 WCF 作为 DAL Linq 并且有一个包含 BLOB 列的表 BLOB 几乎不会改变 每次查询时传输它都会浪费带宽 我看了一
  • @ElementCollection 与 Map 其中 Entity 是 Embeddable 的字段

    在搜索了 JPA 文档和各种帖子后 我对 JPA2 0 是否可以实现以下操作感到困惑 我刚刚开始使用 JPA 所以如果我做了一些愚蠢的事情 请原谅 我的域模型有一个 投资组合 其中包含零个或多个 未平仓头寸 仓位由 工具 JPA 实体 和价
  • SQL Server 中索引的排序规则

    我感兴趣的是 在创建与该列的排序规则不同的索引时是否可以为该列指定排序规则 当建立索引时 字符串数据是根据列的排序规则还是数据库的排序规则排序 您可以使用所需的排序规则创建计算字段 并在此字段上创建索引
  • 在对象数组中添加匹配键的值

    我有一个数组 其中包含许多具有匹配键的对象 a 2 b 5 c 6 a 3 b 4 d 1 a 1 d 2 我想循环遍历数组 如果键匹配 我想将每个键的结果相加 并返回一个包含每个键之和的对象 i e a 6 b 9 c 6 d 3 我目前
  • 有没有办法在 EmberJS 中将数组传递给 currentWhen ?

    我试图使链接在多个路由上保持 活动 状态 例如 users 和 user 有任何想法吗 您可以重新打开 Ember 的 LinkView 并执行类似的操作 允许 currentWhen 包含空格分隔值 Ember LinkView reop
  • 如何使用 jQuery 更改 css 类规则?

    任何人都可以帮助我吗 我的问题有两个部分 我想做的是使用 jQuery 动态更改 css 类规则 classname color red font size 14px 在上面的示例中 我有一个名为 classname现在使用 jQuery
  • 如何在 mongoDB 中对 $lookup 结果应用条件?

    参考我之前的问题 我有一个关于 lookup 的问题 并添加一些条件 您可以从下面的链接描述中获得有关问题的足够参考 Photo id 1 photo name 1 jpg photo description description 1 a
  • 如何借助 Table 组件显示 JRBeanCollectionDataSource 数据?

    我需要在表组件 JasperReports 中显示 JRBeanCollectionDataSource 数据 这是我的模板 ShowPerson jrxml 文件
  • Bootstrap 3.3.5 中无法点击 form-control-feedback 中的链接

    我正在使用链接form control feedback span从 3 1 1 开始执行 javascript 函数 我正在尝试升级到 3 3 5 但是form control feedback改变了 请参阅工作 JsFiddle 3 1
  • 如何让 pandas.read_csv 不执行任何转换?

    例如 tmp test csv 中的值 即01 02 03 旨在代表strings恰好匹配的 d 与整数相反 In 10 print open tmp test csv read A B C 01 02 03 默认情况下 pandas re
  • 有没有办法使文件输入上的本机“浏览”按钮变大跨浏览器?

    如您所知 您可以使用 hacky 方法制作自己的文件输入控件 将文件输入定位在自定义按钮上并使用opacity 0在文件输入本身上 下图显示了预期的设计 其中文件输入绝对位于浏览按钮上方 正如您所看到的 人造浏览按钮比浏览器 Firefox
  • 如何使用 JQuery 格式化货币[重复]

    这个问题在这里已经有答案了 我正在尝试使用下面的代码来格式化货币 currency keyup function e var val this val val val replace 0 9 g if val length gt 2 val
  • 如何在 Firebase 中保存位置信息

    我正在尝试将位置 纬度和经度 保存为 Firebase 中的键 字段之一 在他们的例子中SF车辆 它们确实展示了如何在存储信息后进行查询 但我的问题是如何首先保存 在他们的博客文章中 GeoFire 走向移动 他们展示了数据的样子 但我如何
  • 本地计算机上的MySQL57服务启动然后停止

    当我尝试启动 SQL Server 时 会弹出一条消息 指出它已启动 但随后停止了 这发生在我的服务器重新启动后 有谁知道我该如何解决这个问题 确保数据目录为用户 网络服务 和管理员设置了完全权限 并且如果目录中有空格 则在目录名称周围加上
  • Twitter 关注者数量

    获取纯文本形式的关注者计数的唯一方法是使用 cURL 吗 或者 Twitter API 是否提供任何此类选项 https api twitter com 1 users lookup json screen name tvdw 我的个人资料
  • 无法监听JavaFX中的KeyEvent

    我希望我的 JavaFX 程序能够响应键盘事件 我尝试将侦听器添加到 rootPane 到最上面Pane 但它不响应事件 这是我的代码 AnchorPane root new AnchorPane root setOnKeyPressed
  • C# 6 中(自动)属性初始化语法之间的差异

    C 6 中用于初始化属性的以下表达式有什么区别 1 从构造函数初始化自动属性 public class Context1 public Context1 this Items new List
  • 通过套接字传输文件,最终大小较少字节

    我正在尝试通过 C 中的套接字接收一些文件 但是服务器向我发送了 1000000 字节文件的 64 字节数据包 并且我在目标文件上获得了大约 999902 字节 while n read sd buffer in BUFSIZE BUFSI