HTTP,续~

文章目录

前提摘要

上一章地址,点击浏览

给HTTP完整的一生

一个完整的HTTP请求至少需要以下几个部分

...
、请求行.
、请求头部.
、空行.
、请求体.

...

请求行

结构 > 请求方式 + 请求URL + HTTP协议版本

栗子

html 复制代码
GET www.google.com HTTP/1.1 
POST /interface/doc HTTP/1.0
#get或post请求方式,url使用绝对地址或相对地址
#HTTP1.1相比HTTP1.0,引入了持久连接,需要更多的系统资源,嵌入式不建议使用
#请求方式还有DELETE、PUT、HEAD、OPTIONS等

请求头部

Wireshark抓包分析


c 复制代码
Host: www.example.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml
Accept-Language: zh-CN
Connection: keep-alive

空行

c 复制代码
\r\n\r\n

第一个 \r\n 是上一行内容需要换行,第二个 \r\n 是为了空出一行

请求体

html 复制代码
{
  "name": "张三",
  "age": 26
}

代码实现

为了一目了然,代码未拆分函数部分!

c 复制代码
	// 创建套接字
	int sock = socket(AF_INET, SOCK_STREAM, 0);
	if(sock < 0){
		return -1;
	}
	
	int millsec = 10000;
	struct timeval tv;
	tv.tv_sec = 0;	// 超时时间设置为5秒
	tv.tv_usec = millsec*1000;
	
	if (setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, (const void*)&tv, sizeof(tv)) < 0) {
		
		printf("setsockopt failed\n");
	}
	if (setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO, (const char*)&tv, sizeof(tv)) < 0) {
		printf("setsockopt failed\r\n");
	}
	
	struct sockaddr_in server_addr;
    struct hostent *server;
	
    server = gethostbyname("www.baidu.com");
	if(server == NULL) {
		printf("[ERROR] Get host ip failed\n");
		return -1;
    }
    
    // 设置服务器地址
	memset(&server_addr, 0, sizeof(server_addr));
	server_addr.sin_family = AF_INET;
    memcpy(&server_addr.sin_addr.s_addr,server->h_addr,4);
	server_addr.sin_port = htons(80);
	
	int ret = 0;
	if (0 != 
		(ret = connect(sock, (struct sockaddr *)&server_addr, sizeof(struct sockaddr_in)))) {
		printf("sock_connect fail:%d\n", ret);
		return ret;
	}

	uint8_t http_uri[1024] = {0};
	sprintf(http_uri, "POST %s HTTP/1.0\r\nHost: %s\r\nAccept-Encoding: ''\r\nContent-Type: image/jpeg\r\nContent-Length: %d\r\n"
						"deviceId: %s\r\ndeviceToken: %s\r\naction: start\r\nsid: %d\r\nstream: 1\r\n\r\n", ......);
	
	ret = send(sock, (void*)http_url, strlen(http_uri), 0); // send header
	if(ret <= 0){
		if (sock_recv_timeout(sock)) {
			printf("sock_send\r\n");			
			return 0;
		}
		printf("sock_send failed ret = %d\r\n",ret);
		return -2;
	}
	
	uint8_t body_str[100] = {0};
	os_memcpy(body_str, "123", strlen("123"));
	ret = send(sock, (void*)body_str, strlen(body_str), 0);

	uint8_t rec_str[512] = {0};
	ret = recv(ai_sock, (void*)rec_str, len, 0); 
	if(ret <= 0){
		printf("brush_http_recv failed:%d\r\n", ret);
		return -1;
	}
	
	if(strncmp(rec_str, "HTTP/", strlen("HTTP/")) != 0){
		printf("Not found HTTP\r\n");
		return -2;
	}
	
	uint8_t* p_ptr;
	p_ptr = rec_str+strlen("HTTP/1.1");
	if(atoi(p_ptr) != 200){
		printf("Bad HTTP Code:%d\r\n", atoi(p_ptr));
		return -2;
	}
	
	if((p_ptr = strstr(rec_str, "\r\n\r\n")) == NULL){
		printf("Not found http header\r\n");
		return -2;
	}
	p_ptr += strlen("\r\n\r\n");
	
	uint8_t* p_cnt_len;
	p_cnt_len = strstr(rec_str, "Content-Length:");
	if(p_cnt_len){
		p_cnt_len += strlen("Content-Length:");
		cnt_len = atoi(p_cnt_len);	
		ret -= (p_ptr-rec_str);

		if(cnt_len != ret){
			printf("Content-Length mismatch:%d/%d\r\n", cnt_len, ret);	
			brush_error = BLE_wifi_state_photo_upload_error;	
			goto HTTP_FAILED;
		}
	}

先写到这,静待下一章!

相关推荐
联众合科技31 分钟前
AF 防火墙与传统防火墙核心差异及新型威胁防御实测
网络·安全
三言老师35 分钟前
free查看内存与缓存状态实操
运维·服务器·网络·centos
奥莱维38 分钟前
酒店客控系统多少钱_2026不同规模报价区间透明解析
大数据·网络
无锡耐特森41 分钟前
通过CAN转Profinet网关与PLC的配合引领智慧物流的未来
运维·服务器·网络
羽翼安全1 小时前
严防屏幕泄密:企业防拍摄系统的技术原理与落地实践
网络·安全·电脑
有续技术1 小时前
三菱 (Mitsubishi) 机床 设置查看 IP 地址
linux·服务器·网络
2401_873479401 小时前
IPv6查出来的地理位置是错的?用双栈IP库解决定位偏差问题
网络·数据库·tcp/ip·ip
花生了什么事o1 小时前
WebSocket 与 SSE:实时通信方案的选择
网络·websocket·网络协议
yagami_gagami1 小时前
第四届黄河流域公安院校电子物证个人赛服务器取证
linux·服务器·网络·mysql·安全·docker·llama
九硕智慧建筑一体化厂家1 小时前
直流照明|档案库房专用照明,防紫外线、防纸张老化、适配24小时值守
运维·网络·笔记·智慧城市