感谢 CSDN 赠送的阿里云免费套餐半年使用权,让我有机会与阿里云来个亲密接触。本文是关于如何开通云服务器 ECS、如何登录及使用 ECS,以及通过简单的 UDP 通信实现本地主机与阿里云服务器的连接。
阿里云有很多种产品,主要的几种产品介绍如下:
开通云服务器 ECS 的步骤很简单,进入阿里云官网(https://www.aliyun.com/),找到“产品与服务” –> “云计算基础服务” –> “弹性计算” –> “云服务器 ECS”。点击进入购买页面,根据实际应用需求进行配置,具体可以参考:https://yq.aliyun.com/edu/lesson/play/498 。由于我的是免费体验套餐,可选项较少,因此很快就完成开通了。
我这里选择的是镜像是 Ubuntu 16.04 64bit,完成 ECS 的开通后就可以进入管理后台。可以看到,分配的公网 IP 为 120.77.200.26,之后我们就可以通过这个公网 IP 进行登录以及网络访问了。
我们可以在本地 Ubuntu 中通过 SSH 登录到云服务器 ECS,执行如下命令:
$ ssh root@120.77.200.26
输入云服务器的 root 账户密码即可登录,如下:
我们可以简单查看一些云服务器 ECS 的信息,如 uname -a
查看内核版本:
用 df -h
查看磁盘空间:
用 fdisk -l
查看硬盘及其参数信息:
在这里我们发现 /dev/vda1 可用,而 /dev/vdb 的 20GB 磁盘分区还没有挂载,我们去阿里云管理后台查看,确实存在一块 20GB 的高效云盘。所以我们需要将它挂载,以便使用。
执行 fdisk /dev/vdb
进行磁盘分区及格式化操作。输入“n”新建一个分区,Partition type 选择“p”,Partition number 选择“1”,First sector 和 Last sector 选择默认即可,之后输入“wq”保存退出。整个过程如下:
用 fdisk -l
检查一下,可以看到比刚才多了 /dev/vdb1 一项。
然后进行对磁盘进行格式化,执行命令 mkfs.ext3 /dev/vdb1
,稍等一会即格式化完毕,如下:
然后挂载磁盘,执行如下命令:
$ echo /dev/vdb1 /mnt ext3 default 0 0 >> /etc/fstab
执行 cat /etc/fstab
检查是否写成功。然而此时挂载并没有生效,所以我们还需要手动挂载一下,命令如下:
$ mount /dev/vdb1 /mnt
之后再次用 df -h
查看,可以看到 /dev/vdb1 已经挂载成功,挂载点正是 /mnt 目录,如下:
我们在云服务器 ECS 作为 UDP 通信的 Server,本地主机作为 Client。代码如下:
【服务端 server.c】
// 头文件省略
char rbuf[50];
int main()
{
int sockfd;
int size;
int ret;
int on =1;
struct sockaddr_in saddr;
struct sockaddr_in raddr;
// 设置地址信息,ip信息
size = sizeof(struct sockaddr_in);
bzero(&saddr, size);
saddr.sin_family = AF_INET;
saddr.sin_port = htons(8888); // 绑定的端口号,1024以下不要用
saddr.sin_addr.s_addr = htonl(INADDR_ANY);
// 创建udp 的套接字
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if(sockfd<0)
{
perror("socket failed");
return -1;
}
// 设置端口复用
setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));
// 绑定地址信息,ip信息
ret = bind(sockfd, (struct sockaddr*)&saddr, sizeof(struct sockaddr));
if(ret<0)
{
perror("sbind failed");
return -1;
}
int val = sizeof(struct sockaddr);
// 循环接收客户端发来的消息
while(1)
{
puts("waiting data ......");
ret=recvfrom(sockfd, rbuf, 50, 0, (struct sockaddr*)&raddr, &val);
if(ret <0)
{
perror("recvfrom failed");
}
printf("the data :%s\n", rbuf);
bzero(rbuf, 50);
}
close(sockfd);
return 0;
}
【客户端 client.c】
// 头文件省略
char wbuf[50];
int main()
{
int sockfd;
int size,on = 1;
struct sockaddr_in saddr;
int ret;
size = sizeof(struct sockaddr_in);
bzero(&saddr, size);
// 设置地址信息,ip信息
saddr.sin_family = AF_INET;
saddr.sin_port = htons(8888); // 端口要和服务端绑定的一样
saddr.sin_addr.s_addr = inet_addr("120.77.200.26");// 120.77.200.26 为云服务器的公网ip,这个很重要!
// 创建udp 的套接字
sockfd= socket(AF_INET, SOCK_DGRAM,0);
if(sockfd<0)
{
perror("failed socket");
return -1;
}
// 设置端口复用
setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));
// 循环发送信息给服务端
while(1)
{
puts("please enter data:");
gets(wbuf);
ret=sendto(sockfd, wbuf, 50, 0, (struct sockaddr*)&saddr, sizeof(struct sockaddr));
if(ret<0)
{
perror("sendto failed");
}
bzero(wbuf, 50);
}
close(sockfd);
return 0;
}
分别在云服务器和本地主机上编译 server.c 和 client.c,运行效果如下:
【本地主机】
【云服务器】