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

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

二、 阿里云服务器可以自行去官方购买(现在腾讯和阿里服务器不算贵),如果你是阿里云新用户(个人认证),还可以白嫖一个月服务器的试用期,单独用来学习的足够了。

购买连接:https://developer.aliyun.com/plan/grow-up?spm=5176.19720258.J_3207526240.16.6e842c4avdic6A2.1 购买流程

云服务器能ping通本机 云服务器通信_linux


云服务器能ping通本机 云服务器通信_云服务器能ping通本机_02

2.2 购买完后、进入自己云服务器页面

云服务器能ping通本机 云服务器通信_linux_03

2.3 进入云服务器进行配置

云服务器能ping通本机 云服务器通信_linux_04


这里第三步需要重置密码、后面会用到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地址的命令有所不同

云服务器能ping通本机 云服务器通信_#include_05

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

五、Xshell 连接云服务器

5.1 注意要添加 22端口

云服务器能ping通本机 云服务器通信_服务器_06

5.2 打开Xshell工具 新建会话

云服务器能ping通本机 云服务器通信_c语言_07


云服务器能ping通本机 云服务器通信_云服务器能ping通本机_08


云服务器能ping通本机 云服务器通信_linux_09


出现如下信息说明连接云服务器成功

云服务器能ping通本机 云服务器通信_#include_10


5.3上传我们TCP_IP文件到云服务器、跟之前上传同理

云服务器能ping通本机 云服务器通信_云服务器能ping通本机_11


云服务器能ping通本机 云服务器通信_c语言_12


我们可以看到该文件已经成功上传到云服务器

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

云服务器能ping通本机 云服务器通信_服务器_13


添加9999端口与8888端口号,添加完之后就可以进行通信了、下面是运行结果

云服务器能ping通本机 云服务器通信_云服务器能ping通本机_14


!文章内容如果有误、望指正 完