【问题标题】:CGI/FastCGI app in C/C++ (socket programming question)C/C++ 中的 CGI/FastCGI 应用程序(套接字编程问题)
【发布时间】:2011-01-03 12:24:32
【问题描述】:

我正在使用FastCGI Developers Kit 开发我的第一个 C/C++ fastCGI 应用程序。

我已经成功构建了一个示例程序(如下图sn-p):

int main (void)
{
    int count = 0;
    long pid = getpid();

    streambuf * cin_streambuf  = cin.rdbuf();
    streambuf * cout_streambuf = cout.rdbuf();
    streambuf * cerr_streambuf = cerr.rdbuf();

    FCGX_Request request;

    FCGX_Init();
    FCGX_InitRequest(&request, 0, 0);

    while (FCGX_Accept_r(&request) == 0)
    {
       /* Handle request */
    }

    return 0;
}

但是,当我运行上面的示例时,它只是终止了。调试后,我意识到 FCGX_Accept_r 正在返回错误代码。经过进一步调查,我意识到 accept() 方法调用失败了。

实际失败的行是:

 socket = accept(listen_sock, (struct sockaddr *)&sa, &len);

传递给函数的参数是:

listen_sock: 0
len: 112
sa:

{un = {sun_family = 0, sun_path = "\\000\\000\\000\\000\\000\\000\\000\\000\\000\\000\\000\\000\\000\\000\\000\\000\\000\\000\\000\\000\\000\\000\\000\\000\\000\\000\\020\\"'\\000\\000\\032\\356m\\000\\000\\000\\000\\377\\377\\377\\377\\364\\277\\022\\000\\310\\366\\377\\277\\001\\000\\000\\000\\000\\000\\000\\000X\\366\\377\\277\\343\\276\\004\\b\\377\\377\\377\\377\\001\\000\\000\\000\\001\\000\\000\\000\\000\\000\\000\\000\\001\\000\\000\\000\\310\\366\\377\\277\\210\\366\\377\\277F\\277\\004\\b\\310\\366\\377\\277\\001\\000\\000\\000\\000"}, in = {sin_family = 0, sin_port = 0, sin_addr = {s_addr = 0}, sin_zero = "\\000\\000\\000\\000\\000\\000\\000"}}

我是套接字编程的新手,所以我需要一些帮助来诊断导致 accept() 失败的原因。

鉴于以上信息,任何人都可以看出为什么对 accept() 的调用会失败吗?

我正在 Ubuntu 10.x 上开发

【问题讨论】:

标签: c++ c linux sockets fastcgi


【解决方案1】:

对这个 SDK 了解不多,但是粗略浏览一下它们的标头就会发现,您需要先创建一个套接字来接受传入的请求,然后将其传递给 FCGX_InitRequest 方法。

http://www.fastcgi.com/devkit/include/fcgiapp.h

揭示了一个方法:int FCGX_OpenSocket(const char *path, int backlog);,我假设你调用它来创建套接字,然后调用 FCGX_InitRequest 将此套接字作为第二个参数...

因此为什么你的代码失败了,你为套接字传入了一个 0,这是无效的!

【讨论】:

  • 是的,传递一个值为 0 的套接字 (fd) 对我来说似乎很可疑。谢谢你的提示。我会调查并告诉你。顺便说一句,我构建的代码是套件中的逐字副本。所以它有这样一个基本错误是相当令人担忧的......
  • 0 作为套接字有效;它是标准输入,是 fcgi 库中的默认值。要使用 UNIX 域或 TCP 套接字,请首先调用 FCGX_OpenSocket。然后将文件号返回值传递给FCGX_InitRequest。
猜你喜欢
  • 2022-10-06
  • 1970-01-01
  • 2016-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-25
  • 1970-01-01
相关资源
最近更新 更多