注: 本实验是基于阿里云与ubuntu之间socket通信
一、工具准备
- 1 Xshell (远程连接访问不同系统下的服务器)
- 2 Filezilla (一款免费开源的文件传输协议工具)
二、 阿里云服务器可以自行去官方购买(现在腾讯和阿里服务器不算贵),如果你是阿里云新用户(个人认证),还可以白嫖一个月服务器的试用期,单独用来学习的足够了。
购买连接:https://developer.aliyun.com/plan/grow-up?spm=5176.19720258.J_3207526240.16.6e842c4avdic6A2.1 购买流程
2.2 购买完后、进入自己云服务器页面
2.3 进入云服务器进行配置
这里第三步需要重置密码、后面会用到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端口号,添加完之后就可以进行通信了、下面是运行结果
!文章内容如果有误、望指正 完