C/C++ 中的 CGI/FastCGI 应用程序(套接字编程问题)

发布于 2024-10-10 02:52:52 字数 1662 浏览 3 评论 0原文

我正在开发我的第一个 C/C++ fastCGI 应用程序,使用 FastCGI 开发人员套件< /a>.

我已经成功构建了示例程序之一(如下所示的片段):

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 上进行开发

I am developing my first C/C++ fastCGI app, using the FastCGI Developers Kit.

I have successfully built one of the sample programs (snippet shown below):

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;
}

However, when I run the example above, it simply terminates. Upon debugging, I realized that FCGX_Accept_r was returning an error code. Upon further investigation, I realized that the accept() method call was failing.

The actual line that fails is:

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

The arguments passed to the function are:

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"}}

I am new to socket programming, so I am need some assistance in being able to diagnose what is causing accept() to fail.

Given the information above, can anyone see why the call to accept() would fail?

I am developing on Ubuntu 10.x

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

别想她 2024-10-17 02:52:52

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

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

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

因此,为什么您的代码失败,您为套接字传递了 0,这是无效的!

Don't know much about this SDK, however a cursory glance through their headers reveals that you need to create a socket first to accept an incoming request, and pass this into the FCGX_InitRequest method.

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

reveals a method: int FCGX_OpenSocket(const char *path, int backlog); which I would assume you call to create the socket, and then call FCGX_InitRequest with this socket as the second parameter...

Hence why your code fails, you pass in a 0 for socket, which is invalid!

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文