cUrl запрос с конкретного интерфейса

141
18 мая 2022, 17:50

Имеется ОС Linux, libcurl 7.68.0, 2 интерфейса с доступом в 2 разных подсети.

Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0         192.168.1.1     0.0.0.0         UG    102    0        0 enp0s31f6
0.0.0.0         192.168.0.1     0.0.0.0         UG    103    0        0 enx00a0c6000000
169.254.0.0     0.0.0.0         255.255.0.0     U     1000   0        0 enp0s31f6
192.168.0.0     0.0.0.0         255.255.255.0   U     103    0        0 enx00a0c6000000
192.168.1.0     0.0.0.0         255.255.255.0   U     102    0        0 enp0s31f6

Из с++ кода, с помощью cUrl и опции CURLOPT_INTERFACE делаю Get запрос на внешний домен, но запрос почему-то не выполняется. CURLOPT_VERBOSE показывает следующее:

*   Trying %корректный.внешний.ip.адрес%:443...
* Name '192.168.0.2' family 2 resolved to '192.168.0.2' family 2
* Local port: 0
* Connection timed out after 15001 milliseconds
* Closing connection 0
* Hostname %нужный-домен.ком% was found in DNS cache
*   Trying %корректный.внешний.ip.адрес%:443...
* Hostname 192.168.0.2 was found in DNS cache
* Name '192.168.0.2' family 2 resolved to '192.168.0.2' family 2
* Local port: 0
* Connection timed out after 15001 milliseconds
* Closing connection 1
* Hostname %нужный-домен.ком% was found in DNS cache
*   Trying %корректный.внешний.ip.адрес%:443...
* Hostname 192.168.0.2 was found in DNS cache
* Name '192.168.0.2' family 2 resolved to '192.168.0.2' family 2
* Local port: 0
* Connection timed out after 15000 milliseconds
* Closing connection 2

И так повторяется без конца.

curl_easy_setopt(this->Curl, CURLOPT_INTERFACE, "192.168.0.2"); // пробовал так
curl_easy_setopt(this->Curl, CURLOPT_INTERFACE, "enx00a0c6000000"); // и так тоже

Если установить 192.168.0.1 шлюзом по умолчанию и сделать запрос, то запрос выполнится успешно. Так же успешно выполняется запрос если в CURLOPT_INTERFACE указать адрес из текущей подсети по умолчанию или вовсе убрать эту опцию. В чем может быть проблема?

Answer 1

а если так

CURL *curl = curl_easy_init();
if(curl) {
  curl_easy_setopt(curl, CURLOPT_URL, "https://...."); 
  if(curl_easy_setopt(curl, CURLOPT_INTERFACE, "if!enx00a0c6000000")==CURLE_INTERFACE_FAILED) printf("oops...");
  ret = curl_easy_perform(curl);
 
  curl_easy_cleanup(curl);
}

If the parameter starts with "if!" then it is treated as only as interface name and no attempt will ever be named to do treat it as an IP address or to do name resolution on it. If the parameter starts with "host!" it is treated as either an IP address or a hostname. Hostnames are resolved synchronously. Using the if! format is highly recommended when using the multi interfaces to avoid allowing the code to block. If "if!" is specified but the parameter does not match an existing interface, CURLE_INTERFACE_FAILED is returned from the libcurl function used to perform the transfer.

если не сложно приведите рабочий кусок кода, попробовать воспроизвести

READ ALSO
Профилирование gprof

Профилирование gprof

Помогите разобратьсяКуча мануалов по gprof - но они не понятные

158
Смена знака с + на - в цикле С++

Смена знака с + на - в цикле С++

Я новичок в программировании,нужно написать цикл в котором сумма будет считаться как 1-1/2+1/3-1/4+1/5-1/6 и тд,не совсем понимаю как менять знак с + на - в цикле

223
Ввод и вычисление произведения элементов массива

Ввод и вычисление произведения элементов массива

Найти произведение элементов одномерного массива, состоящего из N элементовРазмер массива и его элементы вводятся с клавиатуры

150
Как правильно отсортировать структуру по полю динамической строки с помощью qsort(СИ)?

Как правильно отсортировать структуру по полю динамической строки с помощью qsort(СИ)?

пишу интерпретатор командЕсть входной файл, в котором даны инструкции вида:

110