命令行连接curl到我的应用程序使用socket()打开的整数套接字

时间:2012-02-08 01:57:48

标签: unix command-line curl libcurl

基本上我有一个打开套接字的应用程序。

e.g。

int socket = socket(PF_LOCAL, SOCK_STREAM, 0);

现在我想向该套接字发送HTTP put请求。我知道我应该使用libcurl,但我无法让它正常工作。所以我想要一种方法将curl连接到我的应用程序。

可能像??

curl -X PUT -d @myXmlFile.xml /var/run/myunixsocket

除了使用libcurl之外没有办法吗???我无法让它工作或找到它实际写入套接字而不是URI的示例。

不用说,HTTP服务器正在侦听该套接字的另一端。

4 个答案:

答案 0 :(得分:3)

您可以在cURL 7.40中使用UNIX套接字并添加新的--unix-socket选项:

curl -X PUT -d @myXmlFile.xml --unix-socket /var/run/myunixsocket

在幕后,它将使用libcurl的CURLOPT_UNIX_SOCKET_PATH选项。如果您想知道如何使用libcurl进行编程,请使用--libcurl选项:

curl --unix-socket /var/run/myunixsocket http://localhost/ --libcurl example.c

生成的文件example.c如下所示:

#include <curl/curl.h>

int main(int argc, char *argv[]) {
    CURLcode ret;
    CURL *hnd;

    hnd = curl_easy_init();
    curl_easy_setopt(hnd, CURLOPT_URL, "http://host/path");
    curl_easy_setopt(hnd, CURLOPT_UNIX_SOCKET_PATH, "/var/run/myunixsocket");

    ret = curl_easy_perform(hnd);

    curl_easy_cleanup(hnd);
    hnd = NULL;

    return (int)ret;
}

答案 1 :(得分:2)

您可以快速设置ncat代理。

终端A

# forward incoming 2375/tcp to unix socket
$ ncat -vlk 2375 -c 'ncat -U /var/run/docker.sock'
Ncat: Version 6.40 ( http://nmap.org/ncat )
Ncat: Listening on :::2375
Ncat: Listening on 0.0.0.0:2375
Ncat: Connection from 127.0.0.1.
Ncat: Connection from 127.0.0.1:55539.

B航站楼

# make a tcp request
$ curl http://localhost:2375/images/json
...

答案 2 :(得分:1)

我尝试使用除AF_INET(6)之外的AF_的curl源,并且发现只有几个对AF_UNIX的引用,这些引用位于libcurl部分并且主要是技术性的,假设有人“else”填充了sockaddr结构。我担心没有办法让curl可执行文件直接执行此操作。

您的应用程序中是否禁止或不希望侦听TCP套接字(作为替代方案,可能)?如果没有,但你并不反对在你的机器上听一个(当然有正确的访问控制),你可以创建一个简单的隧道到AF_LOCAL ...我知道这是一个可怕的解决方法,但它会工作,在至少

答案 3 :(得分:0)

我认为你的问题是curl不知道如何与unix域套接字通信 - 它需要一个tcp套接字。