我想从stdin读取,直到我到达文件结尾然后将其写入套接字。
当我这样做时,我不想读取所有数据,然后在读取后写入套接字。
它应该是:读取一个字节的数据,将其写入套接字,读取另一个字节,将其写入套接字等,直到我到达文件末尾。
这是我到目前为止所做的:
char *buffer[65535];
while (read(0, buffer, 65535) > 0) {
write(sock, buffer, 65535);
}
sock是套接字文件描述符。我刚刚使用了65535,因为在某处我读到它是你可以读取的最大值()。
这看起来如何?
答案 0 :(得分:3)
这看起来如何?
答案:一辆小马车。
仅仅因为您请求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…
或者您可以简单地报告错误并放弃写入过程,这更简单但不具备弹性。