我想从 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/