推荐 原创 视频 Java开发 iOS开发 前端开发 JavaScript开发 Android开发 PHP开发 数据库 开发工具 Python开发 Kotlin开发 Ruby开发 .NET开发 服务器运维 开放平台 架构师 大数据 云计算 人工智能 开发语言 其它开发
Lambda在线 > multisim > 探究http协议

探究http协议

multisim 2018-10-26

所谓http协议就是一种数据结构。

探究的目的是为了更好的理解网络模型--OSI七层参考模型和TCP/IP四层参考模型

如下:L"GET /myweb.htm HTTP/1.1\r\n"

L"Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n"

L"Accept-Language:zh-Hans-CN,zh-Hans;q=0.8,en-US;q=0.6,en; q=0.4, ja; q=0.2\r\n"

L"Host:%s\r\n"

L"Connection:Keep-Alive\r\n"

L"User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36 Edge/17.17134\r\n\r\n",

 

上面的L加字符串是表示宽字符串。

 

数据类型不过多累赘。

 

上代码

 

#include<stdio.h>

#include<Windows.h>

#define RECV_BUFFER_SIZE 8192

 

 

void HttpPostPacket(LPWSTR packet,LPWSTR url,LPWSTR host,CHAR* data)

{

wsprintf(packet,L"POST %s HTTP/1.1\r\n"

L"Accept:*/*\r\n"

L"Accept-Encoding: gzip, deflate\r\n"

L"Content-Type:application/x-www-form-urlencode\r\n"

L"Host:%s\r\n"

L"Content-Length:%d\r\n"

L"Connection:Keep-Alive\r\n"

L"Cookie:"

L"%s\r\n\r\n",

url,host,strlen(data),data);

}

 

 

void HttpGetPacket(LPWSTR packet,LPWSTR url,LPWSTR host,CHAR* data)

{

wsprintf(packet,L"GET %s?%s HTTP/1.1\r\n"

L"Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n"

L"Accept-Language:zh-Hans-CN,zh-Hans;q=0.8,en-US;q=0.6,en; q=0.4, ja; q=0.2\r\n"

L"Host:%s\r\n"

L"Connection:Keep-Alive\r\n"

L"User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36 Edge/17.17134\r\n\r\n",

url,data,host);

}

 

 

 

 

void main(int argc,char* argv[]){

 

wchar_t packet[1024];

char mulpacket[1024];

LPWSTR url=L"/zhuti_multisim_1.html";//实际页面URL: http://bbs.elecfans.com/zhuti_multisim_1.html

LPWSTR host=L"bbs.elecfans.com";

char data[80]="";

//HttpPostPacket(packet,url,host,data);

//printf("%s\n",packet);

 

HttpGetPacket(packet,url,host,data);

int d;

WideCharToMultiByte(

CP_UTF8,WC_SEPCHARS,

packet,

1024,

mulpacket,

1024,

NULL,

&d

);

SOCKADDR_IN clientService;

SOCKET ConnectSocket;

WSADATA wsaData;

LPVOID recvbuf;

int bytesRecv=0;

int bytesSent;

char sendbuf[1024]={0};

char acp[8192]={0};

char *ip="117.25.133.179";

 

 

int iResult=WSAStartup(MAKEWORD(2,2),&wsaData);

if(iResult!=NO_ERROR){

printf("Error at WSASTARTUP()\n");

}

ConnectSocket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);

if(ConnectSocket==INVALID_SOCKET){

printf("Error at socket():%ld\n",WSAGetLastError());

WSACleanup();

return;

}

clientService.sin_family=AF_INET;

clientService.sin_addr.s_addr=inet_addr(ip);

clientService.sin_port=htons(80);//WEB PORT 80

if(connect(ConnectSocket,(SOCKADDR*)&clientService,sizeof(clientService))==SOCKET_ERROR){

printf("Faild to connect(%d)\n",WSAGetLastError());

WSACleanup();

return;

}

if(argc==2&&(!lstrcmpA(argv[1],"-d"))){

strcpy_s(sendbuf,1024,mulpacket);

}

bytesSent=send(ConnectSocket,sendbuf,lstrlenA(sendbuf)+1,0);

if(bytesSent==SOCKET_ERROR)

{

printf("send error(%d)\n",WSAGetLastError());

closesocket(ConnectSocket);

return ;

}

printf("Bytes Sent:%ld\n",bytesSent);

recvbuf=HeapAlloc(GetProcessHeap(),0,RECV_BUFFER_SIZE);

ZeroMemory(recvbuf,RECV_BUFFER_SIZE);

while(bytesRecv!=SOCKET_ERROR)

{

bytesRecv=recv(ConnectSocket,(char*)recvbuf,RECV_BUFFER_SIZE,0);

if(bytesRecv==0)

{

printf("Connection Closed.\n");

break;

}

int ulen=MultiByteToWideChar(CP_UTF8,0,(LPCH)recvbuf,-1,NULL,0);

 

wchar_t j[8192]={0};

MultiByteToWideChar(CP_UTF8,0,(LPCH)recvbuf,-1,j,ulen);

ulen=WideCharToMultiByte(CP_ACP,0,j,-1,NULL,0,NULL,NULL);

WideCharToMultiByte(CP_ACP,0,j,-1,(LPSTR)recvbuf,ulen,NULL,NULL);

printf("Bytes Recv:%ld\n",bytesRecv);

printf("%s\n",recvbuf);

}

HeapFree(GetProcessHeap(),0,recvbuf);

WSACleanup();

system("pause");

return;

}

由上述代码可扩展到ftp,telnet,e-mail,https.

上面的代码在vs2012可正常编译运行。**注意字符集是unicode。

效果如下








若有疑问发消息到后台。













版权声明:本站内容全部来自于腾讯微信公众号,属第三方自助推荐收录。《探究http协议》的版权归原作者「multisim」所有,文章言论观点不代表Lambda在线的观点, Lambda在线不承担任何法律责任。如需删除可联系QQ:516101458

文章来源: 阅读原文

相关阅读

关注multisim微信公众号

multisim微信公众号:A1411464185

multisim

手机扫描上方二维码即可关注multisim微信公众号

multisim最新文章

精品公众号随机推荐