如何在CGI程序中使用UNIX套接字

How to use a UNIX socket in a CGI program

本文关键字:UNIX 套接字 程序 CGI      更新时间:2023-10-16

我想为一个基于UNIX套接字的服务器接口的程序编写一个web接口,但是似乎不可能在CGI程序中成功连接到它。

我看了httpd.conf文件并搜索了web,但没有找到。CGI程序是用c++编写的。UNIX套接字位于httpd服务器允许的路径中

要作为客户端连接到unix本地套接字,首先创建一个匿名套接字,例如TCP:

int fd = socket(AF_LOCAL, SOCK_STREAM, 0);

然后使用目标路径创建一个适当的struct sockaddr_un:

struct sockaddr_un addr;
addr.sun_family = AF_LOCAL;
strcpy(addr.sun_path, "/path/to/server/socket/file");

调用connect():

connect(fd, (struct sockaddr*)&addr, sizeof(addr));

然而,这些都在手册页和在线中有大量的文档。除非您使用第三方库,否则没有c++特定的方法;这些是对标准C:

的*nix特定扩展:
#include <arpa/inet.h>
#include <netinet/ip.h>
#include <sys/socket.h>
#include <sys/types.h>

GNU C参考手册有一章

您的服务器创建没有'group'和'all'写入权限的套接字:srwxr_xr_x。所以将其更改为所有访问权限(chmod 777 ..)等)后,服务器创建管道。然后,我打赌,你的CGI程序将连接…: -)

在bind之后执行chmod。在c程序中,它看起来像这样:

if (bind(sockfd, (struct sockaddr *)&serv_addr, servlen) < 0) {
    perror("Error binding socket:");
    exit 1;
}
if (chmod(PipeName, 0777) == -1) {
    perror("Error in chmod:");
    exit 1;
}