【问题标题】:Use rio_readlineb to read image,but not work使用 rio_readlineb 读取图像,但不起作用
【发布时间】:2016-05-15 09:25:26
【问题描述】:

我正在尝试做一个小的proxy 服务。

现在的问题是我无法显示来自网络服务的图像。

我用Rio_readlineb读回图像数据,但无法显示。

 while ((Rio_readlineb(&rio_client, buf, MAXLINE)) !=0){
     Rio_writen(fd, buf, strlen(buf));
 }

但是当我使用Rio_readnb阅读时,问题就解决了。

while ((size = Rio_readnb(&rio_client, body, MAXLINE)) != 0)
        Rio_writen(fd, body, size);

我不知道问题出在哪里。

readnb

ssize_t rio_readnb(rio_t *rp, void *usrbuf, size_t n) 
{
    size_t nleft = n;
    ssize_t nread;
    char *bufp = usrbuf;

    while (nleft > 0) {
    if ((nread = rio_read(rp, bufp, nleft)) < 0) 
            return -1;          /* errno set by read() */ 
    else if (nread == 0)
        break;              /* EOF */
    nleft -= nread;
    bufp += nread;
    }
    return (n - nleft);         /* return >= 0 */
}

rio_readlineb

ssize_t rio_readlineb(rio_t *rp, void *usrbuf, size_t maxlen) 
{
    int n, rc;
    char c, *bufp = usrbuf;

    for (n = 1; n < maxlen; n++) { 
        if ((rc = rio_read(rp, &c, 1)) == 1) {
        *bufp++ = c;
        if (c == '\n') {
                n++;
            break;
            }
    } else if (rc == 0) {
        if (n == 1)
        return 0; /* EOF, no data read */
        else
        break;    /* EOF, some data was read */
    } else
        return -1;    /* Error */
    }
    *bufp = 0;
    return n-1;
}

rio_readlineb是不是截断了数据?但是如果MAXLINE太小,rio_readnb也会截断数据。那么问题出在哪里?

【问题讨论】:

    标签: c unix networking


    【解决方案1】:

    我假设您正在尝试实现 HTTP 1.0 代理。

    rio_readlineb 正在读取数据中的换行符(\n,十六进制值 0x0A,十进制值 10)。当它读取该字符时,它成功返回,指示读取的字符数。这适用于读取文本数据,例如 HTTP 标头,其中每个标头行都由换行符终止。

    但是,图像数据不会以换行符结尾。事实上,图像可以在其数据中的任何位置包含此字符。当rio_readlineb 在图像数据中找到\n 时,它会返回,但缓冲区可能还没有包含整个图像。因此,您正在向代理客户端发送损坏的图像(太短)。

    在 HTTP 1.0 中,服务器将响应头和数据写入套接字。写入所有数据后,它会关闭套接字。您需要阅读直到文件结束才能获取所有图像数据。这就是你的 Rio_readnbRio_writen 循环正在做的事情。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-08
      • 2021-08-05
      • 1970-01-01
      • 2019-06-27
      • 2015-07-17
      • 1970-01-01
      相关资源
      最近更新 更多