socket编程---实现get post 向http发送请求

来源:互联网 发布:亚龙湾酒店推荐 知乎 编辑:程序博客网 时间:2024/06/06 09:35

一、HTTP

Http定义了与服务器交互的不同方法,最基本的方法有4种,分别是GET,POST,PUT,DELETE。URL全称是资源描述符,我们可以这样认为:一个URL地址,它用于描述一个网络上的资源,而HTTP中的GET,POST,PUT,DELETE就对应着对这个资源的4个操作。到这里,大家应该有个大概的了解了,GET一般用于获取/查询资源信息,而POST一般用于更新资源信息。

         1.根据HTTP规范,GET用于信息获取,而且应该是安全的和幂等的。

          2.根据HTTP规范,POST表示可能修改变服务器上的资源的请求

二、GET

GET:当客户端要从服务器中读取文档时,使用GET方法。
GET方法要求服务器将URL定位的资源放在响应报文的数据部分,回送给客户端。
使用GET方法时,请求参数和对应的值附加在URL后面,利用一个问号(“?”)代表URL的结尾与请求参数的开始,传递参数长度受限制。
例如,/index.jsp?id=100&op=bind。

三、POST

POST:当客户端给服务器提供信息较多时可以使用POST方法。
POST方法将请求参数封装在HTTP请求数据中,以名称/值的形式出现,可以传输大量数据,可用来传送文件。

四、HTTP请求

HTTP报文是面向文本的,报文中的每一个字段都是一些ASCII码串,各个字段的长度是不确定的。HTTP有两类报文:请求报文和响应报文。
请求报文一个HTTP请求报文由请求行(request line)、请求头部(header)、空行和请求数据4个部分组成,下图给出了请求报文的一般格式。
http 1.1

(1)请求行
请求行由请求方法字段、URL字段和HTTP协议版本字段3个字段组成,它们用空格分隔。例如,GET /index.html HTTP/1.1。
HTTP协议的请求方法有GET、POST、HEAD、PUT、DELETE、OPTIONS、TRACE、CONNECT。这里介绍最常用的GET方法和POST方法。
GET:当客户端要从服务器中读取文档时,使用GET方法。GET方法要求服务器将URL定位的资源放在响应报文的数据部分,回送给客户端。使用GET方法时,请求参数和对应的值附加在URL后面,利用一个问号(“?”)代表URL的结尾与请求参数的开始,传递参数长度受限制。例如,/index.jsp?id=100&op=bind。
POST:当客户端给服务器提供信息较多时可以使用POST方法。POST方法将请求参数封装在HTTP请求数据中,以名称/值的形式出现,可以传输大量数据,可用来传送文件。
(2)请求头部
请求头部由关键字/值对组成,每行一对,关键字和值用英文冒号“:”分隔。请求头部通知服务器有关于客户端请求的信息,典型的请求头有:
User-Agent:产生请求的浏览器类型。
Accept:客户端可识别的内容类型列表。
Host:请求的主机名,允许多个域名同处一个IP地址,即虚拟主机。
(3)空行
最后一个请求头之后是一个空行,发送回车符和换行符,通知服务器以下不再有请求头。
对于一个完整的http请求来说空行是必须的,否则服务器会认为本次请求的数据尚未完全发送到服务器,处于等待状态。
(4)请求数据
请求数据不在GET方法中使用,而是在POST方法中使用。POST方法适用于需要客户填写表单的场合。与请求数据相关的最常使用的请求头是Content-Type和Content-Length。

五、代码示例

post

//post#include<stdio.h>#include<winsock2.h>#include<windows.h>#pragma comment(lib, "ws2_32.lib")int main(){int num;SOCKET s;WSADATA wsa;struct sockaddr_in serv;char sndBuf[1024], rcvBuf[2048];WSAStartup(MAKEWORD(2, 1), &wsa);if ((s = socket(AF_INET, SOCK_STREAM, 0))<0){perror("socket error!");exit(1);}memset(&serv,0,sizeof(serv));serv.sin_family = AF_INET;serv.sin_port = htons(80);serv.sin_addr.S_un.S_addr = inet_addr("115.239.210.26");if ((connect(s, (struct sockaddr *)&serv, sizeof(serv)))<0){perror("connet error!");exit(1);}memset(sndBuf, 0, 1024);memset(rcvBuf, 0, 2048);//头信息    strcat(sndBuf, "POST ");    strcat(sndBuf, "http://www.baidu.com");    strcat(sndBuf, " HTTP/1.0\r\n");    strcat(sndBuf, "Host: ");    strcat(sndBuf, "baidu.com");    strcat(sndBuf, "\r\n");    strcat(sndBuf, "Connection: keep-alive\r\n");    strcat(sndBuf, "\r\n");puts(sndBuf);  if ((num = send(s,sndBuf,1024, 0))<0)   {perror("send error!");exit(1);}puts("send success!\n");do{if ((num = recv(s, rcvBuf, 2048, 0))<0){perror("recv error!");system("pause");exit(1);}else if (num>0){printf("%s", rcvBuf);memset(rcvBuf, 0, 2048);}} while (num>0);puts("\nread success!\n");closesocket(s);system("pause");WSACleanup();return 0;}

get

//http get #include<stdio.h>#include<winsock2.h>#include<windows.h>#pragma comment(lib, "ws2_32.lib")int main(){int num;SOCKET s;WSADATA wsa;struct sockaddr_in serv;char sndBuf[1024], rcvBuf[2048];WSAStartup(MAKEWORD(2, 1), &wsa);if ((s = socket(AF_INET, SOCK_STREAM, 0))<0){perror("socket error!");exit(1);}memset(&serv, 0, sizeof(serv));serv.sin_family = AF_INET;serv.sin_port = htons(80);serv.sin_addr.S_un.S_addr = inet_addr("115.239.210.26");//BING 70.37.92.127//BAIDU 115.239.210.26//baidu api 180.149.132.118//google 74.125.31.99//sina  59.175.132.113//163   222.243.110.164//taobao   218.75.155.151//jd    116.211.94.1if ((connect(s, (struct sockaddr *)&serv, sizeof(serv)))<0){perror("connet error!");exit(1);}memset(sndBuf, 0, 1024);memset(rcvBuf, 0, 2048);strcat(sndBuf, "GET /index.html  HTTP/1.0\r\n");strcat(sndBuf, "\r\n");puts(sndBuf);  if ((num = send(s,sndBuf,1024, 0))<0)   {perror("send error!");exit(1);}puts("send success!\n");do{if ((num = recv(s, rcvBuf, 2048, 0))<0){perror("recv error!");exit(1);}else if (num>0){printf("%s", rcvBuf);memset(rcvBuf, 0, 2048);}} while (num>0);puts("\nread success!\n");closesocket(s);system("pause");WSACleanup();return 0;}



0 0
原创粉丝点击