C/C++ - http协议发送字段,文件,单个和多张图片

         关于c/c++ 网络编程,无论在linux还是windows,要说到自由性,和安全性,socket无疑是比较好的!对于socket,因为它的传输协议只有两种tcp和udp,属于网络层,这里我们不去重点讨论。

       关于应用层协议http,如何用C/C++的socket来实现数据传输和下载呢?

   1. http是超文本协议,用在html文件中,那么对于html是如何传输数据呢?   

    通过post或者get传输表单数据,当然http还有其他的方式head,put ,delete,option,trace等方式。head和get差不多,唯一的区别就是head只返回协议头,put和post也很相似,但是可惜html表单数据不支持这一特性,put和post的区别在于,put说出来资源放置于服务器的位置,而post没有,post将这项权利给予服务器来使用。delete顾名思义,就是指定删除在服务器上的资源,option一般用来获取当前URl所支持请求的方法(就是上诉的六种)。

       对于c/c++传输单数据,get方法:

         get方法,  形如: http://i.cnblogs.com/EditPosts.aspx?opt=1 

 这个表单传输的数据就是1,其中键值就是opt,这个需要和服务器上的保持一致

      对于一个简单的html

 

1 <html>
2 <head><title>右边</tile></head>
3 <body>
4  <form >
5   <input  type="text", name="opt" > 1 </input>
6 </form>
7 </body>
8 </html>

 

  opt就是键值

  那么用socket如何实现: 

    首先,windows下,我们

   1. 先要启动异步套接字启动命令

 

//初始化套结字动态库
 2 if (WSAStartup(MAKEWORD(2, 2), &wsd) != 0) //异步套接字启动命令
 3     /版本(次,主)    //返回socket实现细节信息
 4     {
 5             system("WSAStartup failed!\n");
 6             system("pause");
 7             return -1;
 8      }

 

2.在想linux下一样,创建套接字

  sHost = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

3.绑定端口号,和设置要访问的服务器主机地址

      //设置服务器地址

      servAddr.sin_family = AF_INET;
      servAddr.sin_addr.s_addr = inet_addr("203.195.192.24");
     servAddr.sin_port = htons((short)80);

4.连接服务器

 1 retVal = connect(sHost, (LPSOCKADDR)&servAddr, sizeof(servAddr)); 

5.然后接收信息字段

 

 char *pHttpGet = "GET %s?%s HTTP/1.1\r\n"
         "Host: %s:%d\r\n\r\n"; 
         char strHttpGet[1024] = { 0 };
         //ZeroMemory(strHttpGet, BUF_SZIE);   //初始化内存

         char msg[]="username=Gjxun&pwd=sssssss";
         sprintf(strHttpGet, pHttpGet, addr, msg, host, port);
         int var = send(sHost, strHttpGet, strlen(strHttpGet), 0);

 

    recv(sHost,rebuf ,sizeof(rebuf),0);

最后关闭的时候。需要用这个来关闭异步套接字

  

1 WSACleanup( );

 

这是http的基本流程,对于get发送单个或者多个表单数据如上面所示

对于post而言,情况 会多些,也会复杂些

   1.如果发送的是单个或者多个字段信息,那么我们的处理方式大致可以有下面这两种

   第一种: 就像get一样,只不过单纯的将数据放置于协议的后面,需要注意点的是,格式比较重要,特别协议头和正文部分之间需要各一个空行:

    下面的msg亦可以和get一样写成 msg="username=Gxjun&pwd=ssssss"; 还有content-Length的长度: 是正文和正文数据以及尾部长度之后不需要算协议头长度,不然会,当将连接改为Connection: Keep-Alive 出现服务器长时间接受现象。---指导服务器接受到结尾帧或者数据长度达到那个长度为止,才会响应刚才的动作!&#

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值