云服务器配置 UDP通讯 云服务器通信
基于阿里云服务器的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 firewalld2设置打开的端口号(永久打开)
firewall-cmd --add-port=8000/tcp --permanent3.更新,端口的设置
firewall-cmd --reload4.查看已经打开的端口
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通信,但还有不足,代码还在完善中