c - 该代码如何正确实现向套接字传输数据?
问题描述
我目前正在学习在 C 源代码中搜索漏洞。下面的代码片段是查找漏洞的一大段代码的一部分。虽然我不喜欢剧透,但我想知道是否有人可以首先澄清代码实际上在做什么,因为我无法理解它!
功能是:
int writeSock(int sock, char *buf, size_t len)
{
ssize_t byteswrote = 0;
ssize_t ret = 0;
while (byteswrote < len)
{
ret = send(sock, buf + byteswrote, len - byteswrote, 0);
if (ret < 0)
{
return -1;
}
if (ret == 0)
{
break;
}
byteswrote += ret;
}
return byteswrote;
}
如果在 while 循环的第一次迭代中,它是从缓冲区的开头复制到缓冲区的开头 + (len - byteswrote)(我们要复制多少 - 0),那么我们当时还没有复制所有内容吗?为什么我们需要在这里迭代,因为它肯定会在一次迭代中处理所有事情?
也许我以一种非常愚蠢的方式看待这个问题,但出于某种原因我正在努力解决这个问题。
解决方案
答案很明显 -send()
不能保证所有数据都会被发送,因此它会返回实际发送到套接字的数据量,类似于write()
文件操作上的函数。
从我这边两分钱:在你的代码中,如果send()
返回零将打破循环。但是,这不被视为错误。例如,如果缓冲区已满,则可能会发生这种情况。但我不记得我曾经经历过这种情况。
摘自man send
:
返回值
成功时,这些调用返回发送的字节数。出错时,返回 -1,并适当设置 errno。
推荐阅读
- python - 如何在特定行之前插入行?
- excel - 将单元格值除以 n,然后将值拆分到 n 个单元格中
- java - java.lang.ClassNotFoundException:org.netbeans.lib.awtextra.AbsoluteLayout
- javascript - 边缘中具有绝对定位元素的交叉点观察器的问题
- sql-server - 在 SQL 查询中引用 Winforms 对象?
- lua - 您好,我正在尝试设置 gta 服务器,但出现此错误
- ios - NSMutableParagraphStyle 被 UIKit 的 NSString 绘制方法忽略
- python - 从另一个 py 文件接收参数时功能不起作用
- javascript - 尝试使用一个选项卡更改多个 div
- laravel - Laravel Eloquent - 过滤关系的关系