我想从stdin读取,直到到达文件末尾,然后将其写入套接字。
当我这样做的时候,我不想读取所有的数据,然后在读取之后,写入套接字。
它应该是:读取一个字节的数据,将其写入套接字,读取另一个字节,将其写到套接字,等等,直到我到达文件的末尾。
以下是我目前所拥有的:
char *buffer[65535];
while (read(0, buffer, 65535) > 0) {
write(sock, buffer, 65535);
}
sock是套接字文件描述符。我只是用了65535,因为我在某个地方读到它是中可以读取的最大值()
这个看起来怎么样?
这看起来怎么样
答案:一辆小车。
仅仅因为你请求64KiB的数据并不意味着你会得到64KiB数据。你需要记录你收到了多少数据,只写你读到的内容。因此(注意到WhozCraig在评论中提到的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…
或者你可以简单地报告一个错误并放弃写作过程,这要简单得多,但没有那么有弹性。