6、黏包問題
? ? ? ? (1)、原因:發送方發送數據太快或者接收方接收數據太慢,導致數據在緩沖區緩存。
? ? ? ? (2)、解決方法:
? ? ? ? ? ? ? ? ①發送指定大小數據(結構體)
? ? ? ? ? ? ? ? 問題:結構體對齊問題(比如:指定字節對齊)
? ? ? ? ? ? ? ? ? ? ? ? 發送數據類型多樣化時,接收方難以區分接收大小
? ? ? ? ? ? ? ? ②為發送數據增加明顯的分隔符(應用層根據分隔符進行解析)
? ? ? ? ? ? ? ? ③自定義應用層的數據幀
HTTP協議:應用在瀏覽器和服務器中
一、萬維網:WWW(World Wide Web)
1、定義:世界范圍內的,聯機式的信息儲藏所。?? ?
2、萬維網解決了獲取互聯網上的數據時需要解決的以下問題:
(1)、怎樣標識分布在整個互聯網上的文檔 ?URL(統一資源定位符)
(2)、用什么樣的協議實現萬維網上的各種鏈接 ?HTTP
(3)、怎么使用戶能夠方便的查看文檔數據 HTML (超文本標記語言)
二、URL:統一資源定位符
1、定義:表示從因特網上得到的資源位置和訪問這些額資源的方法。
2、格式:<協議>://<主機>:<端口>/<路徑>
三、HTTP(HyperText Transfer Protocol):超文本傳輸協議,應用層
1、定義:定義了萬維網客戶端如何想萬維網服務器請求萬維網文檔,以及服務器怎樣把文檔傳給客戶端。
2、?HTTP工作過程:
(1)建立TCP連接
(2)客戶端向服務器發送HTTP請求報文
(3)服務器向客戶端發送HTTP響應報文
(4)釋放TCP連接
3、HTTP報文格式
請求報文:請求行、消息報頭、請求正文
響應報文:狀態行、消息報頭、響應正文
4、請求方式
GET ? ? 請求獲取Request-URI所標識的資源
POST ? ?在Request-URI所標識的資源后附加新的數據
HEAD ? ?請求獲取由Request-URI所標識的資源的響應消息報頭
PUT ? ? 請求服務器存儲一個資源,并用Request-URI作為其標識
DELETE ?請求服務器刪除Request-URI所標識的資源
TRACE ? 請求服務器回送收到的請求信息,主要用于測試或診斷
OPTIONS 請求查詢服務器的性能,或者查詢與資源相關的選項和需求
CONNECT 用于代理服務器
4.狀態碼
????????1xx:指示信息--表示請求已接收,繼續處理
2xx:成功--表示請求已被成功接收、理解、接受
3xx:重定向--要完成請求必須進行更進一步的操作
4xx:客戶端錯誤--請求有語法錯誤或請求無法實現
5xx:服務器端錯誤--服務器未能實現合法的請求
?? ??? ?200 OK ? ? ?//客戶端請求成功
400 Bad Request ?//客戶端請求有語法錯誤,不能被服務器所理解
401 Unauthorized //請求未經授權?
403 Forbidden ?//服務器收到請求,但是拒絕提供服務
404 Not Found ?//請求資源不存在,eg:輸入了錯誤的URL
500 Internal Server Error //服務器發生不可預期的錯誤
503 Server Unavailable //服務器當前不能處理客戶端的請求,一段時間后可能恢復正常
四、抓包(windows)
? ? ? ? 1、
????????2、
五、客戶端函數
#include"head.h"
int http_tcp(const char*argv,unsigned short port)
{
int sockfd = socket(AF_INET,SOCK_STREAM,0);
if(sockfd < 0)
{
perror("socket fail");
return -1;
}
struct sockaddr_in seraddr;
seraddr.sin_family = AF_INET;
seraddr.sin_port = htons(port);
seraddr.sin_addr.s_addr = inet_addr(argv);
int ret = connect(sockfd,(struct sockaddr*)&seraddr,sizeof(seraddr));
if(ret < 0)
{
perror("connect fail");
return -1;
}
return sockfd;
}int http_send(int argc)
{
char *p = "GET / HTTP/1.1\r\n"
"Host: news.sohu.com\r\n"
"User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/113.0\r\n"
"Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8\r\n"
"Accept-Language: en-US,en;q=0.5\r\n"
"Connection: close\r\n\r\n";?? ?ssize_t size = send(argc,p,strlen(p),0);
if(size < 0)
{
perror("send fail");
return -1;
}
return 0;
}int http_recv(int argc)
{
char buf[1024] = {0};
while(1)
{
memset(buf,0,sizeof(buf));
ssize_t size = recv(argc,buf,sizeof(buf) -1,0);
if(size < 0)
{
perror("recv fail");
return -1;
}
if(size == 0)
{
printf("\nconnect end");
break;
}
printf("%s",buf);
}
return 0;
}int main()
{
int sockfd = http_tcp("1.81.2.197",80);
http_send(sockfd);
http_recv(sockfd);
close(sockfd);
return 0;}