挑个最便宜的先试试 我选用的是CentOs7的系统
我还是喜欢喜欢终端ssh,不想配其他的工具,则连接==公网ip==即可,默认用户为root,去管理界面修改密码后登录使用
ssh root@yourIp
enter your password
input "yes"
(bash不是狗都不用?)安装zsh并安装oh-my-zsh,傻瓜操作
yum install zsh -y
chsh -s /bin/zsh root
echo $SHELL
yum install wget git -y
wget https://github.com/robbyrussell/oh-my-zsh/raw/master/tools/install.sh -O - | zsh
/bin/cp ~/.oh-my-zsh/templates/zshrc.zsh-template ~/.zshrc
source ~/.zshrc
来自segmentfault的强力小磊哥 按照这个来会有点问题,在安装MySQL时会不成功,请参考这个(打不开就翻墙) 按照思否的教程来的话,你的新建账户已经开启了权限,可以远程访问,那下面就要开启远程访问
来自Laravel社区的truesnow 在你自己的主机上安装MySQL后,使用以下命令来远程连接云服务器上的MySQL
mysql -h ipaddress -uusrname -ppassword
例如下面这样
如果你装过Oracle,你会感叹这个安装真是太简单,太现代化了(想起来oracle的监听程序我就想吐)。
如果是轻量化的操作可以选择Beekeeper Studio
如果是有其他的需求,可以看一下这个推荐来自卡拉云的蒋川

这里指的是Linux下Cmake编译的CPP项目 这里我使用的客户端是Ubuntu 20.04LTS 请先安装MySQL,不推荐自己编译
#include <iostream>
#include <mysql/mysql.h> //mysql提供的函数接口头文件
using namespace std;
int main() {
const char* host = "yourIP"; //主机名
const char* user = "yourUsrName"; //用户名
const char* pwd = "yourPassword"; //密码
const char* dbName = "yourDBName"; //数据库名称
int port = 3306; //端口号
// 创建mysql对象
MYSQL *sql = nullptr;
sql = mysql_init(sql);
if (!sql) {
cout << "MySql init error!" << endl;
}
// 连接mysql
sql = mysql_real_connect(sql, host, user, pwd, dbName, port, nullptr, 0);
if (sql) {
cout << "MySql Connect success!" << endl;
}
string command = "select * from runoob_tbl";
int res = mysql_query(sql,command.c_str());
cout<<res<<endl;
// 关闭mysql
mysql_close(sql);
return 0;
}
CMakeLists.txt如下:
cmake_minimum_required(VERSION 3.20)
project(TestConnect)
set(CMAKE_CXX_STANDARD 14)
add_executable(TestConnect main.cpp)
target_link_libraries(${PROJECT_NAME} libmysqlclient.so)
这没啥好说的
F1
搜索 remote-ssh->Add new ssh host
输入 ssh命令:usr@xx.xx.xx.xx
提示输入密码
输入密码完成连接,在左侧选择远程文件夹进行开发
如果提示远程计算机也需要安装插件,则按照提示安装即可,如果安装较慢(这取决于你本机的网络),
可以在网页上下载离线包,拖到远程计算机内离线安装
本机生成密钥后将.pub内容复制到远程计算机下~/.ssh/authorized_keys中即可,没有这个文件就新建一个
本机F1
搜索remote-ssh->open ssh con..
选择第一个配置文件即可
修改其内容为
Host (连接名称)
HostName (ssh_ip地址)
User (ssh用户名)
Port 22(ssh连接端口,默认为22,如果你用其他端口实现别的操作,例如穿透,修改为你使用的端口)
IdentityFile "~/.ssh/id_rsa"(你创建的私钥的位置,默认就是这个)
这样配完了之后,在这里找到你的远程连接,右键选择连接方式即可

这里使用的是C风格的代码
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
int main(){
//创建套接字
int serv_socket = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
/*AF_INET -- 使用IPV4地址
SOCK_STREAM -- 使用面向连接的数据传输方式
IPPROTO_TCP -- 使用TCP协议
*/
//bind
struct sockaddr_in serv_address; //创建服务端对象
memset(&serv_address,0,sizeof(serv_address)); //初始化
serv_address.sin_family = AF_INET; //设定使用IPV4地址
serv_address.sin_addr.s_addr = inet_addr("127.0.0.1"); //设定地址
serv_address.sin_port = htons(1234); //设定端口
//将serv_socket与设定的IP地址和端口绑定,IP地址和端口都保存在sockaddr_in结构体中
bind(serv_socket,(struct sockaddr*)&serv_address,sizeof(serv_address));
//进入被动监听(socket处于休眠状态,收到客户端请求才会被唤醒),等待客户端请求
listen(serv_socket,20);
//接受客户端请求
struct sockaddr_in clnt_addr;
socklen_t clnt_addr_size = sizeof(clnt_addr);
//接收客户端的请求,程序一旦执行到accpet就被阻塞,直至客户端发起请求
int clnt_sock = accept(serv_socket,(struct sockaddr*)&clnt_addr,&clnt_addr_size);
//向客户端发送数据
char str[] = "Hello World!";
write(clnt_sock,str,sizeof(str));
//关闭套接字
close(serv_socket);
close(clnt_sock);
return 0;
}
#include <stdio.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <arpa/inet.h>
int main(){
int sock = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
sockaddr_in serv_addr;
memset(&serv_addr,0,sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
serv_addr.sin_port = htons(1234);
connect(sock,(sockaddr*)&serv_addr,sizeof(serv_addr));
char buffer[40];
read(sock,buffer,sizeof(buffer)-1);
printf(buffer);
close(sock);
return 0;
}
选择你的编译方式编译出来即可
参考csdn的来杯开水,点击这里查看原文
开启8000端口:
firewall-cmd --zone=public --add-port=8000/tcp --permanent
重新载入防火墙
firewall-cmd --reload
查看8000端口是否已经开放
firewall-cmd --list-ports
最后在你的云服务器上开启对应8000端口的安全组即可
放在你的云服务器上
#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("10.0.16.8",&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
socklen_t 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;
}
#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("43.138.55.15",&c_addr.sin_addr);
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;
}


