ECS云服务器简单使用方法以及linux下c++socket搭建web服务器

简介: ECS云服务器使用感受;关于linux下c++socket套接字搭建web服务器的坑:http响应体与跨域请求

ECS云服务器使用感受

因为在学校的一门课程的大作业选择了搭建一个web服务器,于是便想找个云服务器。然后听人推荐就选择了阿里云,正好学生免费,且有良好的新手引导,综合体验还是不错的。
有一说一,要是想使用linux的话,ECS还是值得玩一下的。而且使用阿里云的ecs服务器比自己搭建虚拟机要省事很多,很多设置、操作在控制台里都能搞定,也不怕玩坏。而且只要是联网了就能登录,要是自己的虚拟机想要非宿主机登录的话需要进行很麻烦的配置,而且没有公网ip,出了局域网就用不了。唯一不如自己虚拟机的就是必须要联网,但是现在谁还没个网络,谁写代码不需要上网呢?(笑)
总之,虽然我用的是c++来搭建web服务器(纯纯的折磨自己了),但是阿里云的体验还是不错的。

linux下c++socket搭建web服务器以及一些坑

使用c++搭建web服务器真的折磨,关键是网上的资料也不多,踩坑了要自己想办法解决,大大减低了开发速度。
不过c/c++搭建web服务器最大的优点就是自由,只要掌握了http协议,就可以随心所欲地解析请求,然后随心所欲地返回http响应。毕竟用socket搭建web服务器就是建立tcp连接,读取请求,然后在发回响应(http响应结构的字符串)

踩的坑之一——文本结束符:

sizeof()这个函数是返回一个变量以字节为单位的大小,包括文本结束符'\0',但是'\0'这个字符在浏览器里是乱码:
假设这样写http响应体:

//已经返回了http响应头
//现在返回http响应体
char body[]="{\"user_id\":1,\"password\":123}";
write(clnt_sock,body,sizeof(body));
close(clnt_sock);

但在了浏览器中是这个样子的:
错误json.jpg
可以看到,浏览器中响应体末尾多了个null。
这就是因为write函数把body的文本结束符'\0'也返回去的结果。

如果响应体是html等文本类型可能不会有什么影响,但是要是想返回一个json数据的话,返回的'\0'会影响前端的解析。

“我这里(前端)拿到的响应体格式是字符串而不是json!”(来自于负责前端的同学)。

所以最好不要把字符串的文本结束符给返回给请求方。

只需把write函数三个参数改为sizeof(body)-1,少写回一个字符,便可解决。
注意http响应头中的Content-Length要与响应体的长度一致*

char body[]="{\"user_id\":1,\"password\":123}";
write(clnt_sock,body,sizeof(body)-1);
close(clnt_sock);

这样浏览器就能拿到正确的json格式的字符串
正确json.jpg

注意:用std::string的话,string的length()函数返回值不包含'\0'

std::string body="{\"user_id\":1,\"password\":123}";
write(clnt_sock,body,body.length());
close(clnt_sock);

跨域请求:

浏览器会对跨域请求进行拦截,这是在http响应头中加上Access-Control-Allow-Origin:、Access-Control-Allow-Methods:之类的头部字段和你想要给的值就行了。
浏览器可能会先发送一个OPTIONS请求,这是也需要对该请求响应。

以下为一个http响应样式:

HTTP/1.1 200 OK\r\nContent-Length:28\r\n
Content-Type:application/json;charset=utf-8\r\n
Access-Control-Allow-Origin: *\r\n
Access-Control-Allow-Methods: POST,GET,OPTIONS\r\n
Access-Control-Allow-Headers: client_id, Authorization, Access-Control-Allow-Headers, Origin, Accept, X-Requested-With, Content-Type, Access-Control-Request-Method, Access-Control-Request-Headers\r\n
Connection:close\r\n
\r\n
{"user_id":1,"password":123}

Content-Type为json,编码方式为utf-8;
三个Access字段跨域请求时需要
Connection表明关闭tcp连接

相关实践学习
2分钟自动化部署人生模拟器
本场景将带你借助云效流水线Flow实现人生模拟器小游戏的自动化部署
7天玩转云服务器
云服务器ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,可降低 IT 成本,提升运维效率。本课程手把手带你了解ECS、掌握基本操作、动手实操快照管理、镜像管理等。了解产品详情: https://www.aliyun.com/product/ecs
相关文章
|
14天前
|
人工智能 Linux iOS开发
Burp Suite Professional 2025.2 (macOS, Linux, Windows) - Web 应用安全、测试和扫描
Burp Suite Professional 2025.2 (macOS, Linux, Windows) - Web 应用安全、测试和扫描
41 12
Burp Suite Professional 2025.2 (macOS, Linux, Windows) - Web 应用安全、测试和扫描
|
5月前
|
Linux C语言 C++
vsCode远程执行c和c++代码并操控linux服务器完整教程
这篇文章提供了一个完整的教程,介绍如何在Visual Studio Code中配置和使用插件来远程执行C和C++代码,并操控Linux服务器,包括安装VSCode、安装插件、配置插件、配置编译工具、升级glibc和编写代码进行调试的步骤。
670 0
vsCode远程执行c和c++代码并操控linux服务器完整教程
|
5月前
|
存储 监控 NoSQL
Redis的实现二: c、c++的网络通信编程技术,让服务器处理多个client
本文讨论了在C/C++中实现服务器处理多个客户端的技术,重点介绍了事件循环和非阻塞IO的概念,以及如何在Linux上使用epoll来高效地监控和管理多个文件描述符。
55 0
|
7月前
|
负载均衡 网络协议 Linux
在Linux中,常用WEB服务器负载架构有哪些?
在Linux中,常用WEB服务器负载架构有哪些?
|
7月前
|
Ubuntu 应用服务中间件 Linux
在Linux中,如何配置Web服务器(如Apache或Nginx)?
在Linux中,如何配置Web服务器(如Apache或Nginx)?
|
7月前
|
监控 Linux 应用服务中间件
在Linux中,如何进行Web服务器调优?
在Linux中,如何进行Web服务器调优?
|
7月前
|
存储 弹性计算 大数据
阿里云服务器详细介绍_ECS云服务器优势_云服务器问题解答FAQ
阿里云服务器ECS是一种安全可靠的云计算服务,具备弹性伸缩、高性能及易用性等特点。提供多样化的实例规格,如经济型e、通用算力型u1、计算型c7等,满足不同业务需求。用户可根据业务规模选择合适的计算架构、存储类型及付费模式(包年包月、按量付费等),同时享受专有网络VPC、快照备份及丰富的镜像类型支持。此外,ECS支持免费试用,帮助企业与个人快速上手。
|
8月前
|
弹性计算 安全 Linux
云服务器 ECS产品使用问题之如何处理Linux软件漏洞
云服务器ECS(Elastic Compute Service)是各大云服务商阿里云提供的一种基础云计算服务,它允许用户租用云端计算资源来部署和运行各种应用程序。以下是一个关于如何使用ECS产品的综合指南。
|
7月前
|
Linux 应用服务中间件 网络安全
【Azure 应用服务】查看App Service for Linux上部署PHP 7.4 和 8.0时,所使用的WEB服务器是什么?
【Azure 应用服务】查看App Service for Linux上部署PHP 7.4 和 8.0时,所使用的WEB服务器是什么?
|
7月前
|
Linux Python
【Azure 应用服务】Azure App Service For Linux 上实现 Python Flask Web Socket 项目 Http/Https
【Azure 应用服务】Azure App Service For Linux 上实现 Python Flask Web Socket 项目 Http/Https

热门文章

最新文章