Linux云服务器socket通信

本文详细介绍了如何使用阿里云服务器与Ubuntu Linux通过socket通信,涉及购买流程、服务器配置、代码编写与运行,适合学习者实践网络通信技术。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

基于阿里云服务器的socket通信

该实验是阿里云与ubuntu之间的socket通信可以实现双方的消息传递如下

一、阿里云服务器可以自行去官网下载(学生的话28块钱3个月)

https://www.aliyun.com/activity/new?utm_content=se_1009243113

1.1进入官网后,完成相关的信息注册与认证(学生等认证)后,如果是学生可直接在搜索栏输入“成长计划”

以下是服务器的购买流程:

 

二、购买服务器后,进入远程连接 后可以有一个终端操作界面,我买的linux的服务器,因此操作是

平常linux的类似。

 

可以通过宝塔面板来连接界面如下

三、话不多说,进行代码的编写,先是云服务端的socket代码的配置编写

#include<stdio.h>
#include <unistd.h>
#include<sys/types.h>

#include<sys/socket.h>

#include<netinet/in.h>

#include<arpa/inet.h>

#include<stdlib.h>

#include<string.h>


int main()
{

        int s_fd;
        int c_fd;
        int n_read;
        char readBuf[128];
        // char *msg = "I get your connect";
        char msg[128] = {0};

        struct sockaddr_in s_addr;
        struct sockaddr_in c_addr;

        memset(&s_addr,0,sizeof(struct sockaddr_in));   //数据的清空,清空完配置
        memset(&c_addr,0,sizeof(struct sockaddr_in));

        //1.socket

        s_fd=socket(AF_INET,SOCK_STREAM,0);

        if(s_fd == -1){
                perror("socket");
                exit(-1);
        }

        s_addr.sin_family= AF_INET;
        s_addr.sin_port = htons(8000);   //端口号 该端口号需要网络与安全->安全组中先创建好
        inet_aton("内网的ip",&s_addr.sin_addr); //IP地址 注意ip地址是内网的ip地址,把字符串形式的“192.168**”转化为网络能识别的格式

        //2.bind


        bind(s_fd,(struct sockaddr *)&s_addr,sizeof(struct sockaddr_in));//Bind()函数:IP号端口号与相应描述字赋值函数,用于绑定IP地址和端口号到socketfd
        //3.listen
        listen(s_fd,10);                            //监听设置函数

        //4.accept

        int  length = sizeof(struct sockaddr_in);   //计算长度

        while(1)                                    //循环等候连接服务器
        {
                c_fd =accept(s_fd,(struct sockaddr *)&c_addr,&length); //accept函数由TCP服务器调用,用于从已完成的连接队列对头返回下一个已完成连接,如果已完成的队列为空,那么进程被投入睡眠。
                if(c_fd == -1){

                        perror("accept");
                }

                if(fork() == 0)    //创建一个子进程使他和服务器进行read的操作
                {
                        while(1)
                        {
                                printf("gte connect: %s\n",inet_ntoa(c_addr.sin_addr));
                                n_read = read(c_fd,readBuf,128); //在套接字通性中进行字节读取函数: read();
                                if(n_read == -1)
                                {
                                        perror("read");
                                }else{
                                        printf("get message:%d %s\n",n_read,readBuf);

                                }
                        }
                }
                if(fork()==0)                   //创建一个子进程使它和服务器进行write的操作
                {
                        while(1)
                        {
                                memset(msg,0,sizeof(msg));
                                printf("Input:");
                                fgets(msg,sizeof(msg),stdin);
                                write(c_fd,msg,strlen(msg));
                        }
                }
        }
        return 0;

}

注意1:阿里云端服务器socket绑定阿里云的内网地址(可inconfig来查),要连接阿里云服务器的客户端的socket要设置为阿里云的公网地址

注意2:云服务器里的socket代码端口要提前配好    在   安全--》防火墙(如下图一)里配置可添加规则端口,查看是否添加,可在windows->cmd中输入telnet +公网ip+端口               号

              用宝塔的话可在安全里查看放行端口(如下图二)

 

添加完成后将该端口拉入防火墙

     1.开启防火墙

systemctl start firewalld

    2设置打开的端口号(永久打开)

firewall-cmd --add-port=8000/tcp --permanent

     3.更新,端口的设置

firewall-cmd --reload

      4.查看已经打开的端口

firewall-cmd --list-all

这样就可以使用云服务器的公网ip与设置的端口号,与其他网络进行连接了

 

四、客户端的client的代码

#include<stdio.h>
#include <unistd.h>
#include<sys/types.h>
#include<sys/socket.h>

#include<netinet/in.h>

#include<arpa/inet.h>

#include<stdlib.h>

#include<string.h>


int main()
{
        int c_fd;
        int n_read;
        char readBuf[128];
        char msg[128]= {0} ;
        struct sockaddr_in c_addr;
        memset(&c_addr,0,sizeof(struct sockaddr_in));
        c_fd = socket(AF_INET,SOCK_STREAM,0);      //创建套接字
        if(c_fd == -1)
        {
                perror("connect");
                exit(-1);
        }
        c_addr.sin_family = AF_INET;
        c_addr.sin_port = htons(8000);      //这里要填自己写在服务器里已经添加过的端口号

        inet_aton("公网ip",&c_addr.sin_addr); ////注意这里要填阿里云服务器的公网ip

        if(connect(c_fd,(struct sockaddr *)&c_addr,sizeof(struct sockaddr))== -1)  //客户端的connect函数该函数用于绑定之后的client端(客户端),与服务器建立连接
        {
                perror("connect");
        }
        while(1)
        {


                //3.write()
                if(fork() == 0)      //创建一个子进程与服务端进行write的操作
                {
                        while(1)
                        {
                                memset(msg,0,sizeof(msg));
                                printf("Input:\n");
                                fgets(msg,sizeof(msg),stdin);
                                write(c_fd,msg,strlen(msg));
                        }
                }
                //4
                //
                n_read  = read(c_fd,readBuf,sizeof(readBuf));    //客户端对服务端进行read的读取

                if(n_read == -1){
                        perror("read");
                }else{
                        printf("get message from server:%d,%s\n",n_read,readBuf);


                }

        }
        return 0;
}

 

五、运行后的效果

是ubuntu的Linux端为客户端的代码与阿里云的代码sockte运行后,双方可以实现相互的消息的接收和发送如下:

客户端:

服务端

本代码基本可以实现阿里云与unbuntu的socket通信,但还有不足,代码还在完善中

 

 

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值