实现本地主机与阿里云服务器的UDP通信

0、概述

  感谢 CSDN 赠送的阿里云免费套餐半年使用权,让我有机会与阿里云来个亲密接触。本文是关于如何开通云服务器 ECS、如何登录及使用 ECS,以及通过简单的 UDP 通信实现本地主机与阿里云服务器的连接。

实现本地主机与阿里云服务器的UDP通信_第1张图片

  阿里云有很多种产品,主要的几种产品介绍如下:

  • ECS (Elastic Compute Service):以虚拟机的方式将一台物理机分成多台云服务器,提供可伸缩的计算服务。
  • SLB (Server Load Balance):基于LVS和Tengine实现的4层和7层负载均衡,有动态扩容,session保持等特点。
  • RDS (Relational Database Service);:通过云服务的方式让关系型数据库管理、操作和扩展变得更加简单。
  • OCS (Open Cache Service):基于内部Tair,增加一层Proxy,支持海量小数据的高速访问。
  • OTS(Open Table Service):海量(结构化)数据存储和实时查询服务。
  • OSS(Open Store Service):对任意大小数据对象提供高可用,高可靠的海量存储服务。
  • CDN(Content Delevery Network):通过覆盖全网的缓存服务以及负载均衡等技术将用户请求定向到最合适的区域,提高用户服务的响应速度及网站服务能力。
  • OAS (Open Archive Service):离线归档,冷数据备份,类似Amazon Glacier。
  • ODPS(Open Data Processing Service):海量数据处理和分析平台。
  • SLS (Simple Log Service):解决异构、分布式系统中日志实时收集、存储与查询的基础服务。

1、开通云服务器 ECS

  开通云服务器 ECS 的步骤很简单,进入阿里云官网(https://www.aliyun.com/),找到“产品与服务” –> “云计算基础服务” –> “弹性计算” –> “云服务器 ECS”。点击进入购买页面,根据实际应用需求进行配置,具体可以参考:https://yq.aliyun.com/edu/lesson/play/498 。由于我的是免费体验套餐,可选项较少,因此很快就完成开通了。
  

实现本地主机与阿里云服务器的UDP通信_第2张图片

  我这里选择的是镜像是 Ubuntu 16.04 64bit,完成 ECS 的开通后就可以进入管理后台。可以看到,分配的公网 IP 为 120.77.200.26,之后我们就可以通过这个公网 IP 进行登录以及网络访问了。

实现本地主机与阿里云服务器的UDP通信_第3张图片

2、登录及使用 ECS

  我们可以在本地 Ubuntu 中通过 SSH 登录到云服务器 ECS,执行如下命令:

$ ssh root@120.77.200.26

  输入云服务器的 root 账户密码即可登录,如下:

实现本地主机与阿里云服务器的UDP通信_第4张图片

  我们可以简单查看一些云服务器 ECS 的信息,如 uname -a 查看内核版本:

这里写图片描述

  用 df -h 查看磁盘空间:

实现本地主机与阿里云服务器的UDP通信_第5张图片

  用 fdisk -l 查看硬盘及其参数信息:

实现本地主机与阿里云服务器的UDP通信_第6张图片

  在这里我们发现 /dev/vda1 可用,而 /dev/vdb 的 20GB 磁盘分区还没有挂载,我们去阿里云管理后台查看,确实存在一块 20GB 的高效云盘。所以我们需要将它挂载,以便使用。

实现本地主机与阿里云服务器的UDP通信_第7张图片

  执行 fdisk /dev/vdb 进行磁盘分区及格式化操作。输入“n”新建一个分区,Partition type 选择“p”,Partition number 选择“1”,First sector 和 Last sector 选择默认即可,之后输入“wq”保存退出。整个过程如下:

实现本地主机与阿里云服务器的UDP通信_第8张图片

  用 fdisk -l 检查一下,可以看到比刚才多了 /dev/vdb1 一项。

实现本地主机与阿里云服务器的UDP通信_第9张图片

  然后进行对磁盘进行格式化,执行命令 mkfs.ext3 /dev/vdb1 ,稍等一会即格式化完毕,如下:

实现本地主机与阿里云服务器的UDP通信_第10张图片

  然后挂载磁盘,执行如下命令:

$ echo /dev/vdb1 /mnt ext3 default 0 0 >> /etc/fstab

  执行 cat /etc/fstab 检查是否写成功。然而此时挂载并没有生效,所以我们还需要手动挂载一下,命令如下:

$ mount /dev/vdb1 /mnt

  之后再次用 df -h 查看,可以看到 /dev/vdb1 已经挂载成功,挂载点正是 /mnt 目录,如下:

实现本地主机与阿里云服务器的UDP通信_第11张图片

3、实现 UDP 通信

  我们在云服务器 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,运行效果如下:

【本地主机】

这里写图片描述

【云服务器】

这里写图片描述

你可能感兴趣的:(Web开发,Web全栈开发之旅)