首页 > 解决方案 > 该代码如何正确实现向套接字传输数据?

问题描述

我目前正在学习在 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),那么我们当时还没有复制所有内容吗?为什么我们需要在这里迭代,因为它肯定会在一次迭代中处理所有事情?

也许我以一种非常愚蠢的方式看待这个问题,但出于某种原因我正在努力解决这个问题。

标签: carraysloopssockets

解决方案


答案很明显 -send()不能保证所有数据都会被发送,因此它会返回实际发送到套接字的数据量,类似于write()文件操作上的函数。

从我这边两分钱:在你的代码中,如果send()返回零将打破循环。但是,这不被视为错误。例如,如果缓冲区已满,则可能会发生这种情况。但我不记得我曾经经历过这种情况。

摘自man send

返回值
成功时,这些调用返回发送的字节数。出错时,返回 -1,并适当设置 errno。


推荐阅读