Linux-搭建云服务器进行socket通信

注: 本实验是基于阿里云ubuntu之间socket通信
一、工具准备

  • 1 Xshell (远程连接访问不同系统下的服务器)
  • 2 Filezilla (一款免费开源的文件传输协议工具)

二、 阿里云服务器可以自行去官方购买(现在腾讯和阿里服务器不算贵),如果你是阿里云新用户(个人认证),还可以白嫖一个月服务器的试用期,单独用来学习的足够了。
购买连接:https://developer.aliyun.com/plan/grow-up?spm=5176.19720258.J_3207526240.16.6e842c4avdic6A
2.1 购买流程
在这里插入图片描述
在这里插入图片描述

2.2 购买完后、进入自己云服务器页面
在这里插入图片描述

2.3 进入云服务器进行配置
mg.cn/42b93ede9d52461496d0e65b1ae5be16.png)
这里第三步需要重置密码、后面会用到Xshell工具连接到云服务器,这里我已经重置过了,就不再演示了。

三、编写服务器与客户端程序
服务器程序、接收客户端发送过来的数据原样回射。

#include <stdio.h> //printf
#include <sys/socket.h> //socket
#include <netinet/in.h> //sockaddr_in
#include <arpa/inet.h> //htons inet_addr
#include <unistd.h> //close
#include <stdlib.h> //exit
#include <string.h> 
#include <sys/wait.h> //wait waitpid
#include <signal.h> //signal

#define MAXSIZE 255

void error_hanglde(char *message);
void process_hanglde(int sig);

int main(int argc,const char *argv[])
{
	int sockfd,cli_sock;
	ssize_t n;
	socklen_t clilen;
	char message[MAXSIZE];
	pid_t pid;
	
	struct sockaddr_in ser_addr,cli_addr;
	struct sigaction act;
	
	if(argc != 3)
	{
		fprintf(stderr,"Usage  %s ip potr\n",argv[0]);
	}
	
	sockfd = socket(AF_INET,SOCK_STREAM,0);
	if(sockfd == -1)
		error_hanglde("sockfd() error!");
	
	bzero(&ser_addr,sizeof(ser_addr));			
	ser_addr.sin_family = AF_INET;
	ser_addr.sin_addr.s_addr = inet_addr(argv[1]);  //设置IP地址,如果是阿里云,要设置成内网IP地址,而不是公网IP地址
	ser_addr.sin_port = htons(atoi(argv[2]));		//端口号
	
	if(bind(sockfd,(struct sockaddr *)&ser_addr,sizeof(ser_addr)) == -1)
		error_hanglde("bind() error!");
	
	if(listen(sockfd,10) == -1)
		error_hanglde("listen() error!");
	
	act.sa_handler = process_hanglde;
	sigemptyset(&act.sa_mask);
	act.sa_flags = 0;
	
	sigaction(SIGCHLD,&act,0);
	
	//进行通信
	for(;;)
	{
		clilen = sizeof(cli_addr);
		cli_sock = accept(sockfd,(struct sockaddr *)&cli_addr,&clilen);
		if(cli_sock == -1)
			continue;
		else
			printf("[%s - %d] Connect Client:%d\n",inet_ntoa(cli_addr.sin_addr),ntohs(cli_addr.sin_port),cli_sock);
			
		//创建子进程	
		pid = fork();
		if(pid == -1)
		{
			close(cli_sock);
			continue;
		}	
		if(pid == 0) //子进程执行区域
		{
			close(sockfd); //关闭监听套接字
			while((n = read(cli_sock,message,MAXSIZE)) != 0) //数据收发
			{
				write(cli_sock,message,n);
				message[n] = 0;
						
			}
			printf("[%s - %d] client disconnte:%d\n",inet_ntoa(cli_addr.sin_addr),ntohs(cli_addr.sin_port),cli_sock);
		
			
			close(cli_sock);
			return 0;
		}
	}
	close(sockfd);
	close(cli_sock);
	
	return 0;
	
}




void process_hanglde(int sig)
{
	pid_t pid;
	int status;
	
	pid = waitpid(-1,&status,WNOHANG); 
	if(WIFEXITED(status))
	{
		printf("process recv id = %d\n",pid);
	}
}	

void error_hanglde(char *message)
{
	fputs(message,stderr);
	fputs("\n",stderr);
	exit(0);
}

客户端程序

#include <stdio.h> //printf
#include <sys/socket.h> //socket
#include <netinet/in.h> //sockaddr_in
#include <arpa/inet.h> //htons inet_addr
#include <unistd.h> //close
#include <stdlib.h> //exit
#include <string.h> 

#define MAXSIZE 255



void error_hag(char *message);

int main(int argc,const char *argv[])
{
	int sockfd;
	ssize_t n;
	char message[MAXSIZE],ReadLine[MAXSIZE];
	
	if(argc != 3)
	{
		fprintf(stderr,"Usage  %s ip potr\n",argv[0]);
	}
	
	sockfd = socket(AF_INET,SOCK_STREAM,0);
	if(sockfd == -1)
		error_hag("sockfd() error");

	
	struct sockaddr_in ser_addr;
	
	bzero(&ser_addr,sizeof(ser_addr));
	ser_addr.sin_family = AF_INET;
	ser_addr.sin_addr.s_addr = inet_addr(argv[1]);  //设置为公网IP地址
	ser_addr.sin_port = htons(atoi(argv[2]));		//对应服务器端口号
	
	if(connect(sockfd,(struct sockaddr *)&ser_addr,sizeof(ser_addr)) == -1)
		error_hag("connect() error");


	for(;;)
	{
		
		fputs("Input info(Q ~ Quit):",stdout);
		fgets(message,MAXSIZE,stdin);
		
		
		if(strcmp(message,"Q\n") == 0 || strcmp(message,"Quit\n") == 0)
			break;
		
		write(sockfd,message,strlen(message));	
		n = read(sockfd,ReadLine,MAXSIZE);
		ReadLine[n] = 0;
		fputs(ReadLine,stdout); 
		
	}
	
	close(sockfd);
}
void error_hag(char *message)
{
	fputs(message,stderr);
	fputs("\n",stderr);
	exit(0);
}

上传文件到云服务器有点麻烦、推荐使用Filezilla工具、方便灵活。

四、Filezilla上传文件到云服务器

4.1
虚拟机IP地址可以通过命令ifconfig查询,注意不同Linux下的操作系统查询IP地址的命令有所不同
在这里插入图片描述

这时候就可以上传自己想要的文件了、这里我已经将编写好的文件TCP_IP上传到了PC端。
然后我们接着将PC端的TCP_IP文件上传到我们的云服务器。

五、Xshell 连接云服务器
5.1 注意要添加 22端口
在这里插入图片描述

5.2 打开Xshell工具 新建会话
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
出现如下信息说明连接云服务器成功
在这里插入图片描述
5.3上传我们TCP_IP文件到云服务器、跟之前上传同理
在这里插入图片描述
在这里插入图片描述
我们可以看到该文件已经成功上传到云服务器

六、进行socket通信
注意:我们要跟云服务器进行socket通信要提前从安全组配置好端口,跟之前添加22端口是一样的

在这里插入图片描述
添加9999端口与8888端口号,添加完之后就可以进行通信了、下面是运行结果
在这里插入图片描述
!文章内容如果有误、望指正 完

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值