由于物联网的兴起,其中著名的CoAP协议与http有着千丝万缕的关联,所以想学习一下http。
在网上找了很久关于c语言的http库,其中libghttp很符合我的需求,便开始了学习使用libghttp库之路,期间遇到一些麻烦,在此记录一下如何解决遇到的问题以及学习的过程。
首先到libghttp库官方下载地址下载 Libghttp-1.0.9
http://www.linuxfromscratch.org/blfs/view/6.2.0/gnome/libghttp.html
拿到libghttp-1.0.9.tar.gz文件后上传到云服务器(centos 7)
解压后会得到一个libghttp-1.0.9的文件夹,cd进入
执行 ./configure --prefix=/opt/gnome-1.4 && make
期间可能会遇到一些错误,如:configure: error: libtool configure failed
解决办法是
cp /usr/share/libtool/config/config.guess ./config.guess
cp /usr/share/libtool/config/config.sub ./config.sub
参考链接:https://blog.csdn.net/joyjj0218/article/details/46797701
继续:
./configure --prefix=/opt/gnome-1.4 && make
安装
sudo make install
编译dome,gcc xxx.c -o xxx -lghttp
执行 ./xxx 报错 error while loading shared libraries: libghttp.so.1: cannot open shared object file: No such file or directory
可能是centos 7 使用make install 太粗暴了,编译后的库链接文件没有弄到系统库文件夹下,需要重建/etc/ld.so.cache
参考链接:https://blog.csdn.net/David_xtd/article/details/7625626
一、将所有的用户需要用到的库放到/usr/loca/lib
二、在/etc/ld.so.conf.d/目录下新建文件usr-libs.conf,内容是:/usr/local/lib
三、#sudo ldconfig
继续编译,执行,ok
dome源码如下:
GET:
/*
* libghttp_get.c
* http get test
* Created on: 2013年10月25日
* Author: elesos.com
*/
#include <stdio.h>
#include <string.h>
#include <ghttp.h>
int main(int argc, char **argv)
{
char *uri = "http://www.elesos.com/%E9%A6%96%E9%A1%B5";
ghttp_request *request = NULL;
ghttp_status status;
FILE * pFile;
char *buf;
int bytes_read;
int size;
pFile = fopen ( "elesos.html" , "wb" );
request = ghttp_request_new();
if(ghttp_set_uri(request, uri) == -1)
return -1;
if(ghttp_set_type(request, ghttp_type_get) == -1)//get
return -1;
ghttp_prepare(request);
status = ghttp_process(request);
if(status == ghttp_error)
return -1;
printf("Status code -> %d\n", ghttp_status_code(request));
buf = ghttp_get_body(request);
bytes_read = ghttp_get_body_len(request);
size = strlen(buf);//size == bytes_read
fwrite (buf , 1 ,size , pFile );
fclose(pFile);
return 0;
}
POST:
int post_test() {
char szXML[2048];
char szVal[256];
ghttp_request *request = NULL;
ghttp_status status;
char *buf;
char retbuf[128];
int len;
strcpy(szXML, "POSTDATA=");
sprintf(szVal, "%d", 15);
strcat(szXML, szVal);
printf("%s\n", szXML); //test
request = ghttp_request_new();
if (ghttp_set_uri(request, uri) == -1)
return -1;
if (ghttp_set_type(request, ghttp_type_post) == -1) //post
return -1;
ghttp_set_header(request, http_hdr_Content_Type,
"application/x-www-form-urlencoded");
//ghttp_set_sync(request, ghttp_sync); //set sync
len = strlen(szXML);
ghttp_set_body(request, szXML, len); //
ghttp_prepare(request);
status = ghttp_process(request);
if (status == ghttp_error)
return -1;
buf = ghttp_get_body(request); //test
sprintf(retbuf, "%s", buf);
ghttp_clean(request);
return 0;
}
再次感谢各位前辈留写下来的宝贵经验。