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连接

相关实践学习
借助OSS搭建在线教育视频课程分享网站
本教程介绍如何基于云服务器ECS和对象存储OSS,搭建一个在线教育视频课程分享网站。
7天玩转云服务器
云服务器ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,可降低 IT 成本,提升运维效率。本课程手把手带你了解ECS、掌握基本操作、动手实操快照管理、镜像管理等。了解产品详情: https://www.aliyun.com/product/ecs
相关文章
|
16天前
|
关系型数据库 MySQL Linux
在Linux中,如何配置数据库服务器(如MySQL或PostgreSQL)?
在Linux中,如何配置数据库服务器(如MySQL或PostgreSQL)?
|
16天前
|
Ubuntu 应用服务中间件 Linux
在Linux中,如何配置Web服务器(如Apache或Nginx)?
在Linux中,如何配置Web服务器(如Apache或Nginx)?
|
16天前
|
安全 Ubuntu 网络协议
在Linux中,如何配置DHCP服务器?
在Linux中,如何配置DHCP服务器?
|
16天前
|
域名解析 网络协议 Linux
在Linux中,如何配置DNS服务器?
在Linux中,如何配置DNS服务器?
|
7天前
|
网络协议 C# 开发者
WPF与Socket编程的完美邂逅:打造流畅网络通信体验——从客户端到服务器端,手把手教你实现基于Socket的实时数据交换
【8月更文挑战第31天】网络通信在现代应用中至关重要,Socket编程作为其实现基础,即便在主要用于桌面应用的Windows Presentation Foundation(WPF)中也发挥着重要作用。本文通过最佳实践,详细介绍如何在WPF应用中利用Socket实现网络通信,包括创建WPF项目、设计用户界面、实现Socket通信逻辑及搭建简单服务器端的全过程。具体步骤涵盖从UI设计到前后端交互的各个环节,并附有详尽示例代码,助力WPF开发者掌握这一关键技术,拓展应用程序的功能与实用性。
20 0
|
9天前
|
缓存 Linux 调度
Linux服务器如何查看CPU占用率、内存占用、带宽占用
Linux服务器如何查看CPU占用率、内存占用、带宽占用
40 0
|
10天前
|
Linux 网络安全 网络架构
如何处理在学校Linux连接不上服务器
如何处理在学校Linux连接不上服务器
27 0
|
16天前
|
关系型数据库 MySQL Linux
在Linux中,如何配置邮件服务器?
在Linux中,如何配置邮件服务器?
|
6天前
|
数据库 开发者 Python
web应用开发
【9月更文挑战第1天】web应用开发
20 1
|
3天前
|
数据采集 Java 数据挖掘
Java IO异常处理:在Web爬虫开发中的实践
Java IO异常处理:在Web爬虫开发中的实践
下一篇
DDNS