原文鏈接:http://blog.csdn.net/laoyang360/article/details/8280478
一、HTTP原理
1.HTTP工作原理(實例分析):
<1> http客戶端與http服務器建立TCP連接;
<2> http客戶端通過瀏覽器向http服務器80端口發送HTTP連接請求;
<3>如果http服務器允許訪問,則返回連接確認,雙方建立HTTP連接;
<4>. http客戶端發送HTTP頁面請求(Http Analyzer V5分析結果)
<5>. http服務器尋找該HTTP文件,如果找到則返回該文件的超文本。http客戶端的瀏覽器對接收到的超文本進行解析,翻譯成格式化的頁面,顯示給用戶;
(Http服務器模擬返回)
<6>. http服務器發送完HTTP內容後,斷開HTTP連接;
<7>. 雙方斷開TCP連接;
<span style="font-size:14px;">/*-----------------------------------------------
-------------HTTPServer---------------------
------------------------------------------------*/
#include <winsock2.h>
#include <stdio.h>
int main(void)
{
//----------------------
// Initialize ......
int len = 0;
char buff[4096];
char msgret[4096];
memset( msgret, 0x00, sizeof(msgret) );
//----------------------
// Initialize Winsock.
WSADATA wsaData;
int iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
if (iResult != NO_ERROR) {
printf("Error at WSAStartup()\n");
return 1;
}
//----------------------
// Create a SOCKET for listening for
// incoming connection requests.
SOCKET ListenSocket;
ListenSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (ListenSocket == INVALID_SOCKET) {
printf("Error at socket(): %ld\n", WSAGetLastError());
WSACleanup();
return 1;
}
//----------------------
// The sockaddr_in structure specifies the address family,
// IP address, and port for the socket that is being bound.
sockaddr_in service;
service.sin_family = AF_INET;
service.sin_addr.s_addr = inet_addr("10.166.178.225");
service.sin_port = htons(80);
if (bind( ListenSocket,
(SOCKADDR*) &service,
sizeof(service)) == SOCKET_ERROR) {
printf("bind() failed.\n");
closesocket(ListenSocket);
WSACleanup();
return 1;
}
//----------------------
// Listen for incoming connection requests.
// on the created socket
if (listen( ListenSocket, 1 ) == SOCKET_ERROR)
{
printf("Error listening on socket.\n");
closesocket(ListenSocket);
WSACleanup();
return 1;
}
//----------------------
// Accept the connection.
SOCKET AcceptSocket;
printf("Waiting for client to connect...\n");
while(1)
{
AcceptSocket = accept( ListenSocket, NULL, NULL );
if (AcceptSocket == INVALID_SOCKET)
{
printf("accept failed: %d\n", WSAGetLastError());
closesocket(ListenSocket);
WSACleanup();
return 1;
}
else
{
printf("Client connected.\n");
memset( buff, 0x00, sizeof(buff) );
len = recv(AcceptSocket, buff, 4096, 0);
printf( "msg recv:\n%s\n", buff );
sprintf( msgret, "HTTP/1.1 200 OK\n"
"Date: Fri, 02 Mar 2012 01:59:03 GMT\n"
"Server: Apache"
"Location: http://www.sina.com.cn/\n"
"Cache-Control: max-age=60\n"
"Expires: Fri, 02 Mar 2012 02:00:03 GMT\n"
"Vary: Accept-Encoding\n"
"Content-Length: 231\n"
"Content-Type: text/html; charset=iso-8859-1\n"
"X-Cache: MISS from xd33-82.HP08040021.sina.com.cn\n"
"Connection: close\n\n"
"<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML 2.0//EN\">\n"
"<html><head>\n"
"<title>title test</title>\n"
"</head><body>\n"
"<h1>test body</h1>\n"
"<h2>test sub body</h2>\n"
"<p>My First Test!</p>\n"
"</body></html>" );
len = send( AcceptSocket, msgret, sizeof(msgret), 0 );
if( len <= 0 )
{
printf( "send failed\n" );
}
}//end else
}//end while
// No longer need server socket
closesocket(ListenSocket);
WSACleanup();
return 0;
}</span>
服務器端的顯示結果…
2.HTTP請求(request)&響應(response)報文解讀(Http Analyzer V5分析結果)
2.1 HTTP請求報文(Header部分)
GET請求:是以實體的方式得到由請求URL所指定資源的信息,如果請求URL只是一個數據產生過程,那麼最終要在響應實體中的是處理過程的結果所指向的資源,而不是處理過程的描述。GET是向服務器發索取數據的一種請求。
[1]GET /HTTP/1.1
[2]Accept:image/gif, Image/x-xbitmap, image/jpeg, Image/pjpeg, application/x-shockwave
-flash, application/x-silverlight,application/vnd.ms-excel, application/vnd.ms-powerpoint,application/msword, */* //客戶端可識別的內容類型列表。
[3]Accept-Language:zh-cn 客戶端所能解釋的語言:簡體中文
[4]UA-CPU: x86(上面未體現出來)
[5]Accept-Encoding:gzip, deflate //客戶端可以解釋的類型
[6]User-Agent:Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; InfoPath.3; .NET CLR2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022; .NET 4.0C; .NET4.0E)
//客戶端瀏覽器型號(同下)
[7]Host: 10.166.178.225提交請求頁面(用本地機器測試,即爲本地IP地址;此處可以是網站域名如:www.dlut.edu.cn)。
[8]Connection:Keep-Alive TCP連接保持打開。
2.2 HTTP響應報文(Header部分)
[1](Status-Line)HTTP/1.1 200 OK
[2]Date: Fri, 02Mar 2012 01:59:03 GMT
[3]Server:ApacheLocation:http://www.sina.com.cn
[4]Cache-Control:max-age=60
[5]Expires: Fri,02 Mar 2012 02:00:03 GMT
[6]Vary: Accept-Encoding
[7]Content-Type:text/html; charset=iso-8859-1
[8]X-Cache:MISS from xd33-82.HP08040021.sina.com.cn
[9]Connectionclose
該響應信息也以對應的4部分組成:
協議狀態描述,HTTP/1.1表示協議版本,200 OK表示服務器已經成功處理了客戶端發出的請求。200表示HTTP的應答碼成功。HTTP應答碼由3位數字構成,其中首位數字定義了應答碼的類型:
1XX-信息類(Information),表示收到Web瀏覽器請求,正在進一步的處理中
2XX-成功類(Successful),表示用戶請求被正確接收,理解和處理例如:200 OK
3XX-重定向類(Redirection),表示請求沒有成功,客戶必須採取進一步的動作。
4XX-客戶端錯誤(Client Error),表示客戶端提交的請求有錯誤 例如:404 NOT Found,意味着請求中所引用的文檔不存在。
5XX-服務器錯誤(Server Error)表示服務器不能完成對請求的處理:如 500
響應報頭:跟請求報頭一樣,它指出服務器的功能,標識出響應數據的細節。
空行:也是屬於響應報頭和響應正文之間必須存在的一個空行,表示響應報頭結束,接下來是響應正文
響應正文:也就是服務器返回的網頁內容。