最近想连接下http协议底层的实现原理,就在网上找资料使用C++套接字模仿了http协议,闲话不多说,直接上代码:
#include <Winsock2.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#pragma comment(lib,"ws2_32.lib")
/*封装一个遵守Http协议的字符串
模拟GET请求
p : 要请求的地址
p1:模仿Http协议的字符串
*/
void package(char *p, char *p1)
{
char *pHttpGet = "GET %s?%s HTTP/1.1\r\n"
"Host: %s:%d\r\n\r\n";
char *addr = p;
char *host = "127.0.0.1";
int port = 8080;
char *msg = "aaa=wanshengdao&bbb=123456";
char strHttpGet[1024] = {0};
sprintf(strHttpGet, pHttpGet, addr, msg, host, port);
//strcpy(strHttpGet, p1);
strcpy(p1, strHttpGet);
}
/*使用TCP协议连接,并发送信息*/
int link()
{
WSADATA wsaData;
WORD wVersionRequested;
wVersionRequested = MAKEWORD(1, 1);
int err = WSAStartup(wVersionRequested, &wsaData);
if( err != 0)
{
return 0;
}
if( LOBYTE(wsaData.wVersion) != 1 || HIBYTE( wsaData.wVersion) != 1)
{
WSACleanup();
return 0;
}
SOCKET sockClient = socket(AF_INET, SOCK_STREAM, 0);
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
addrSrv.sin_family = AF_INET;
addrSrv.sin_port = htons(8080);
connect(sockClient, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR));
char content[1024] = {0};
/*这是我自己的测试tomcat写的界面*/
package("http://localhost:8080/SocketRequair/Test.jsp", content);
printf("%s", content);
send(sockClient, content, strlen(content)+1, 0);
char recvBuf[1024] = {0};
/*接收来自tomcat返回的页面*/
recv(sockClient, recvBuf, 1024, 0);
printf("%s\n", recvBuf);
closesocket(sockClient);
WSACleanup();
return 1;
}
int main()
{
int status = link();
if( !status ) {
printf("连接错误!");
exit(0);
}
system("pause");
return 0;
}
上面是c++代码,下面是效果图:
下面是jsp代码,抱歉,我好像上不了代码,只能上图片了: