从标准读取和写入套接字

时间:2014-09-11 01:31:10

标签: c file io stream buffer

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

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

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

这是我到目前为止所做的:

char *buffer[65535];

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

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

这看起来如何?

1 个答案:

答案 0 :(得分:3)

这看起来如何?

答案:一辆小马车。

仅仅因为您请求64KiB数据并不意味着您将获得64KiB数据。您需要记录您收到的数据量,并且只记录您阅读的内容。因此(注意WhozCraigcomment提到的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…

或者您可以简单地报告错误并放弃写入过程,这更简单但不具备弹性。