c - 从标准中读取并写入套接字

标签 c file io stream buffer

我想从 stdin 读取直到到达文件末尾,然后将其写入套接字。

当我这样做时,我不想读取所有数据,然后在读取后写入套接字。

应该是:读取一个字节的数据,将其写入套接字,读取另一个字节,将其写入套接字,等等,直到到达文件末尾。

这是我目前所拥有的:

char *buffer[65535];

while (read(0, buffer, 65535) > 0) {
    write(sock, buffer, 65535);
}

sock 是套接字文件描述符。我刚刚使用了 65535,因为我在某处读到它是您可以读取 () 的最大值。

这看起来怎么样?

最佳答案

这看起来怎么样?

答案:有点小bug。

仅仅因为您请求 64KiB 数据并不意味着您将获得 64KiB 数据。您需要记录您确实收到了多少数据,并且只写您阅读的内容。因此(注意 WhozCraig 在他的 comment 中提到的 buffer 类型的变化):

char buffer[65536];
int nbytes;
while ((nbytes = read(0, buffer, sizeof(buffer))) > 0)
{
    if (write(sock, buffer, nbytes) != nbytes)
    {
        …process short write…
    }
}

有几种方法可以处理短写。一种是捕获实际写入的字节数,一直循环,直到读取的数据全部写入完毕。下面的循环将替换所有 if (write(…)…) 代码。

警告:未经测试的代码!

    int nleft = nbytes;
    int nwritten;
    char *start = buffer;
    while (nleft > 0 && (nwritten = write(sock, start, nleft)) > 0)
    {
        nleft -= nwritten;
        start += nwritten;
    }
    if (nwritten < 0)
        …process error…

或者您可以简单地报告一个错误并放弃编写过程,这要简单得多,但弹性不强。

关于c - 从标准中读取并写入套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25777613/

相关文章:

PYTHON - 从文件中读取单行

c - 二进制 * 的无效操作数(有 'double *' 和 'double *' )

c - 需要有关添加 openssl 库的帮助

java - 为什么不推荐使用 java.io.File?

c - (C编程)逐字符读取文本文件并删除点和逗号前的空格和连字符

linux - Linux磁盘I/O如何处理不同大小的文件

c - C 的 std::unordered_set(int) 容器库

c - C中的定点数字振铃滤波器

c - Win32 API CopyFile() 无法发送多个文件

io - kqueue() 和 O_NONBLOCK