gpt4 book ai didi

html - CGI 不会在 c (Eclipse) 中通过 HTML 显示变量

转载 作者:太空宇宙 更新时间:2023-11-03 23:24:52 24 4
gpt4 key购买 nike

我使用 fifo 管道将一些数据(天气数据)读入 char 变量。控制台将正确显示此变量。但是,当我尝试在 CGI 页面上通过 HTML 显示它时,它根本不显示。下面的代码 -

int main(void) {
int fd;
char *myfifo = "pressure.txt";
char buff[BUFFER];
long fTemp;

//open and read message
fd = open(myfifo, O_RDONLY);
read(fd, buff, BUFFER);
printf("Received: %s\n", buff);
close(fd);



printf("Content-type: text/html\n\n");
puts("<HTML>");
puts("<BODY>");
printf("Data is: %s", buff);
puts("</BODY>");
puts("</HTML>");

return EXIT_SUCCESS;
}

如您在控制台中所见,显示正确 -

Received: 2014-08-13 16:54:57
25.0 DegC, 1018.7 mBar

Content-type: text/html

<HTML>
<BODY>
Data is 2014-08-13 16:54:57
25.0 DegC, 1018.7 mBar
</BODY>
</HTML>
logout

但在CGI网页上它不显示天气数据,但显示“data is”。

最佳答案

编写 CGI 程序时的两件重要事情:

  • 该程序将由网络服务器运行,通常是以不同的用户身份开始(例如“www”用户)。
  • 有可能该程序是从另一个程序中启动的目录,如果不这样做,可能会导致不同的行为指定要打开的文件的完整路径。

由于这两种情况都可能导致问题,因此可能会有所帮助添加一些调试信息。当然,这总是一个好主意检查您使用的函数的返回值。

为了更容易显示调试或错误消息,我首先将以下代码向上移动,以便之后的所有输出它将由浏览器呈现:

    printf("Content-type: text/html\r\n\r\n");
puts("<HTML>");
puts("<BODY>");

了解网络服务器使用什么作为目录可能会有用程序从哪里开始。 getcwd电话可以在这里提供帮助。让我们使用大小为 BUFFER 的缓冲区来存储结果,并检查它是否有效:

char curpath[BUFFER];

if (getcwd(curpath, BUFFER) == NULL)
printf("Can't get current path: %s<BR>\n", strerror(errno));
else
printf("Current path is: %s<BR>\n", curpath);

getcwd 函数在出错时返回 NULL,并设置值errno 到一个数字,表示出了什么问题。要转换这个对可读的东西的值(value),strerror功能被使用。例如,如果 BUFFER 不够大能够存储路径,你会看到类似的东西

Can't get current path: Numerical result out of range

open调用返回一个负数如果它不起作用,则再次设置 errno。因此,要检查这是否有效:

fd = open(myfifo, O_RDONLY);
if (fd < 0)
printf("Can't open file: %s<BR>\n", strerror(errno));

万一文件可以找到,但是webserver没有权限打开它,你会看到

Can't open file: Permission denied

如果程序是从您想象的另一个目录启动的,并且它无法找到文件,你会得到:

Can't open file: No such file or directory

添加此类调试信息应该可以更清楚地了解发生了什么,以及更多重要的是,出了什么问题。

为了确保读取实际数据也没有问题,返回read 的值(value)功能应该是检查并采取适当的措施。如果 read 失败,返回一个负数。要处理这个:

numread = read(fd, buff, BUFFER);
if (numread < 0)
printf("Error reading from file: %s<BR>\n", strerror(errno));

另一个值表示成功,返回成功的字节数读。如果确实读取了 BUFFER 字节,则完全不确定buff 中的最后一个字节是 0,printf 需要它来知道何时字符串结束。为了确保它实际上是空终止的,最后一个字节buff 设置为 0:

if (numread == BUFFER) 
buff[BUFFER-1] = 0;

请注意,这实际上覆盖了在此读取的字节之一案例。

如果读取的字节较少,仍然不能确定读取的最后一个字节读取的是 0,但现在我们可以在读取的字节后放置我们自己的 0所以它们都没有被覆盖:

else 
buff[numread] = 0;

要使一切正常,您可能需要以下附加包含文件:

#include <unistd.h>
#include <string.h>
#include <errno.h>

我描述的完整代码如下所示:

int main(void) 
{
int fd, numread;
char *myfifo = "pressure.txt";
char buff[BUFFER];
char curpath[BUFFER];
long fTemp;

// Let's make sure all text output (even error/debug messages)
// will be visible in the web page
printf("Content-type: text/html\r\n\r\n");
puts("<HTML>");
puts("<BODY>");

// Some debug info: print the current path
if (getcwd(curpath, BUFFER) == NULL)
printf("Can't get current path: %s<BR>\n", strerror(errno));
else
printf("Current path is: %s<BR>\n", curpath);

// Open the file
fd = open(myfifo, O_RDONLY);
if (fd < 0)
{
// An error occurs, let's see what it is
printf("Can't open file: %s<BR>\n", strerror(errno));
}
else
{
// Try to read 'BUFFER' bytes from the file
numread = read(fd, buff, BUFFER);
if (numread < 0)
{
printf("Error reading from file: %s<BR>\n", strerror(errno));
}
else
{
if (numread == BUFFER)
{
// Make sure the last byte in 'buff' is 0, so that the
// string is null-terminated
buff[BUFFER-1] = 0;
}
else
{
// Fewer bytes were read, make sure a 0 is placed after
// them
buff[numread] = 0;
}

printf("Data is: %s<BR>\n", buff);
}
close(fd);
}

puts("</BODY>");
puts("</HTML>");

return EXIT_SUCCESS;
}

关于html - CGI 不会在 c (Eclipse) 中通过 HTML 显示变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29717393/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com