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



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

或者你可以简单地报告一个错误并放弃写作过程,这要简单得多,但没有那么有弹性。

相关内容

  • 没有找到相关文章

最新更新