Командная строка соединяет curl с целочисленным сокетом, открытым моим приложением с помощью socket - PullRequest
2 голосов
/ 08 февраля 2012

В основном у меня есть приложение, которое открыло сокет.

например,

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

Теперь я хочу отправить HTTP-запрос на установку в этот сокет.Я знаю, что должен использовать libcurl, но я просто не могу заставить это работать правильно.Поэтому я хочу, чтобы способ подключения curl к моему приложению.

Может быть, что-то вроде ??

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

Нет ли другого способа, кроме использования libcurl ???Я не могу заставить его работать или найти пример того, как он фактически записывает данные в сокет, а не в URI.

Само собой разумеется, что HTTP-сервер прослушивает другой конец этого сокета.

Ответы [ 4 ]

3 голосов
/ 04 декабря 2014

Вы сможете использовать гнезда UNIX в cURL 7.40 с добавлением новой опции --unix-socket:

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

Под капотом будет использоваться CURLOPT_UNIX_SOCKET_PATH вариант libcurl.Если вы хотите знать, как программировать с помощью 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;
}
2 голосов
/ 08 ноября 2014

Вы можете быстро настроить прокси 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
...
1 голос
/ 24 июля 2012

Я попытался найти источник curl для AF_, отличного от AF_INET (6), и нашел только пару ссылок на AF_UNIX, которые были в части libcurl и были в основном техническими, предполагая, что кто-то "else" заполняет структуру sockaddr. Боюсь, что нет способа заставить исполняемый файл curl делать это напрямую.

Запрещено или нежелательно в вашем приложении прослушивать сокет TCP (в качестве альтернативы, может быть)? Если нет, но вы не против прослушивания музыки на своем компьютере (конечно, с надлежащим контролем доступа), вы можете создать ее просто как туннель к AF_LOCAL ... Я знаю, что это ужасный обходной путь, но он будет работать, на как минимум.

0 голосов
/ 02 марта 2012

Я думаю, что ваша проблема здесь в том, что curl не знает, как связаться с сокетом домена unix - он ожидает сокет tcp.

...