免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 6059 | 回复: 4
打印 上一主题 下一主题

[C] 如何通过 c/c++ 实现http请求? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-03-20 10:28 |只看该作者 |倒序浏览
下面是一段java程序,功能是向指定的URL短信服务中心发送信息,通过服务中心将短信内容发送给指定的用户,我想通过C语言实现这个功能,请问应该怎么处理,
请帮忙看下,谢谢!


import java.io.UnsupportedEncodingException;
import org.apache.commons.httpclient.Header;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.NameValuePair;
import org.apache.commons.httpclient.methods.PostMethod;

public class SendMsg_webchinese {

         public static void main(String[] args)throws Exception
         {
         HttpClient client = new HttpClient();
         PostMethod post = new PostMethod("http://gbk.sms.webchinese.cn");
         post.addRequestHeader("Content-Type","application/x-www-form-urlencoded;charset=gbk");//在头文件中设置转码
        NameValuePair[] data ={ new NameValuePair("Uid", "本站用户名"),new NameValuePair("Key", "接口安全密码"),new NameValuePair("smsMob","手机号码"),new NameValuePair("smsText","短信内容")};
        post.setRequestBody(data);

         client.executeMethod(post);
         Header[] headers = post.getResponseHeaders();
         int statusCode = post.getStatusCode();
         System.out.println("statusCode:"+statusCode);
         for(Header h : headers)
         {
         System.out.println(h.toString());
         }
         String result = new String(post.getResponseBodyAsString().getBytes("gbk"));
         System.out.println(result);
         post.releaseConnection();
         }
}

论坛徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46处女座
日期:2013-10-24 14:25:01酉鸡
日期:2014-04-07 11:54:15
2 [报告]
发表于 2014-03-20 10:56 |只看该作者
libcurl。。。。。

论坛徽章:
0
3 [报告]
发表于 2014-03-20 11:21 |只看该作者
哦了 试试看 谢了!

论坛徽章:
0
4 [报告]
发表于 2014-03-20 17:06 |只看该作者
道理是一样的,也是监听某个端口,比如80,然后收到请求就处理再回复。
有几个简单的web server代码可参考,如Mongoose,只有一个.h和一个.c,非常容易看懂。
libevent库也提供了一个http的封装,这个是最好用的,几行代码就实现基础功能了,拿它用在不少项目上。
建议用1.4的版本,代码比2.x简单一些。

论坛徽章:
0
5 [报告]
发表于 2014-04-01 01:16 |只看该作者
本帖最后由 xiao_xia_m 于 2014-04-01 01:19 编辑

其实这个不是特别难,主要是用HTTP头填充,比如我打开百度时候的首页,用wireshark抓取了浏览器发送出去的报文
GET / HTTP/1.1
Host: www.baidu.com
Connection: keep-alive
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.152 Safari/537.36
Accept-Encoding: gzip,deflate,sdch
Accept-Language: zh-CN,zh;q=0.8
把这一部分send出去,然后就可以recieve了。主要是理解HTTP协议。
大概流程是这样的
(1)先从域名转化为ip,
(2)然后建立一个tcp链接,端口一般为80,8080等,网页一般是80,
(3)再send http头,前面截取的那一部分,
(4)接收,如果是压缩的还需要解压。

欢迎关注:http://blog.sina.com.cn/u/2241974477
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP