基于阿里云服务器的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通信,但还有不足,代码还在完善中