curl和openssl交叉编译和curl命令使用

curl依赖openssl,所以需要先编译openssl:

编译openssl:

下载openssl:https://github.com/openssl/openssl/tree/OpenSSL_1_0_2r,下载解压。
参照:https://blog.csdn.net/ty3219/article/details/77717478 的方法一去编译,分别执行:

./Configure --prefix=/home/nfsshare/hisi/curl/curl/openssl shared no-asm linux-armv4
make CC="arm-none-linux-gnueabi-gcc" AR="arm-none-linux-gnueabi-ar r" RANLIB="arm-none-linux-gnueabi-ranlib" LD="arm-none-linux-ld"
make install

结果出现:Relocations in generic ELF (EM: 40)错误,格式不正确:

/usr/bin/ld: /opt/wifi/tool/openssl/lib/libcrypto.a(ex_data.o): Relocations in generic ELF (EM: 40)
/usr/bin/ld: /opt/wifi/tool/openssl/lib/libcrypto.a(ex_data.o): Relocations in generic ELF (EM: 40)
/opt/wifi/tool/openssl/lib/libcrypto.a: could not read symbols: File in wrong format
collect2: ld 返回 1
make: *** [hostapd] 错误 1

未找到合适和解决方法,于是放弃此方法,改用方法二:
执行config:

make distclean
./config --prefix=/home/nfsshare/hisi/curl/curl/openssl -shared no-asm

然后 vi Makefile 修改 CC=arm-linux-gcc 并将 -m64 参数去掉,然后 make,make install,就安装完成了。

接下来编译curl:

从 https://curl.haxx.se/download/curl-7.67.0.tar.gz 下载源码,执行:

./configure --prefix=/home/nfsshare/hisi/curl/curl --host=arm-none-linux CC=arm-linux-gcc --with-ssl=/home/nfsshare/hisi/curl/curl/openssl
make
make install

于是curl编译就完成了,将编译出来的curl不需要的目录文件(.a、include等)清理掉,拷贝到设备上就可以开始执行了。

curl使用:

首先设置环境变量:

export LD_LIBRARY_PATH=/mnt/curl/lib:/mnt/curl/openssl/lib:$LD_LIBRARY_PATH

发送GET请求比较简单:

./curl http://192.168.1.3/a.asp

发送POST请求:

./curl -d "username=admin&z999=z999&password=admin&Login=&platform=pc&langSelection=zhcn" http://192.168.1.3/goform/login
./curl -d "na" http://192.168.1.3/goform/get_web_hotspots_list

更复杂的:

./curl -H "Content-Type:application/json" -X POST -d '{"user": "admin", "passwd":"admin"}' http://192.168.1.3/login

当然也可以代码控制,参考:

// Write callback.
size_t WriteCallback(char *ptr, size_t size, size_t nitems, void *userdata) {
  std::string* str = reinterpret_cast<std::string*>(userdata);
   str->append(ptr, size * nitems);
   return size * nitems;
}
bool Post(const std::string & url, const std::string & data, std::string & content)
{
    // Check parameters.
    if (url.empty()) {
       assert(false);
       return false;
    }
    content.clear();
    // Initialize curl.
    CURL* curl = Curl::curl_easy_init();
    if (!curl) {
       assert(false);
       return false;
    }
    Curl::curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
    Curl::curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback);
    Curl::curl_easy_setopt(curl, CURLOPT_WRITEDATA, &content);
    Curl::curl_easy_setopt(curl, CURLOPT_POST, 1L);
    Curl::curl_easy_setopt(curl, CURLOPT_POSTFIELDS, data.c_str());
    Curl::curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 1L);
    Curl::curl_easy_setopt(curl, CURLOPT_TCP_NODELAY, 1L);
    Curl::curl_easy_setopt(curl, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
    Curl::curl_easy_setopt (curl, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0);
   //Curl::curl_easy_setopt(curl, CURLOPT_TIMEOUT_MS, 1000L);//超时设置
    // Get.
    CURLcode status = Curl::curl_easy_perform(curl);
    int code = 0;
    Curl::curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &code);
    // Cleanup.
    Curl::curl_easy_cleanup(curl);
    if (CURLE_OK != status) {
       LOG_ERROR("curl_easy_perform failed: " << status);
       return false;
    }
    if (code != 200) {
       LOG_INFO("response code: " << code);
       return false;
    }
    return true;
}

注:编译出现You need Perl 5.,则需要安装peral5,参照:

cd perl-5.28.0
./Configure -des -Dprefix=$HOME/localperl
make
make install

注2:对于不是自己的页面,可以用 Wireshark 抓包,找POST,GET等包请求的内容,如:
在这里插入图片描述

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值