近期由于一些科研任务的需要,以及希望强化一下计算机网络的基础知识(其他知识也打算后续慢慢补上),决定开个新坑,跟着 Beej’s Guide to Network Programming 这本书来做一些简单的网络编程。网络编程主要是以C为主,因此需要在Linux上编译代码,有一个很方便的方法就是直接用VSCode连接虚拟机,通过VSCode实现在虚拟机上的编程,因此便有了该配置环境的记录。
下面记录的整个过程是基于配完的环境进行的回顾,因此可能存在许多疏漏,如果有疏漏的地方,愿意的话可以指出来,我会即时修改的,谢谢各位。同时,也有可能因为不同人的电脑环境配置不同,出现各种奇奇怪怪的bug,遇到问题多查查资料,总能解决的。
前期准备
主要需要的软件工具有:VSCode、VMWare软件(已经按照好带Ubuntu系统的虚拟机)
本人使用的是VMWare上的ubuntu20.04系统的虚拟机,虚拟机之前在操作系统课程设计就已经配好了,因此可以直接通过vscode连接虚拟机,并且能使用ssh免密登录,大概做的内容有:
安装好相关插件
在VSCode上,需要安装的插件最核心的是Remote – SSH,它是远程编程的基础插件。
配置虚拟机
首先需要确保虚拟机已经安装好了ssh工具,具体命令为:
sudo apt-get install openssh-server
安装完后,记得使用以下命令检查一下服务是否开启,没开启的记得开启。
# 查看状态的命令
systemctl status sshd
# 启动服务的命令
service sshd start
然后通过命令查看虚拟机的内网IP地址,记录下虚拟机IP地址。
这里有一个很重要的点,需要检查自己的电脑能否直接ping通虚拟机的IP地址,如果ping不通,需要先配置好虚拟机的网络,这里就不赘述。比如我的虚拟机IP地址为192.168.186.100,则一定要在Window上先用cmd输入命令检查一下:
远程连接虚拟机
1.重新启动VSCode,可以看到界面的左下角有一个绿色的按钮
2.点击之后会有一个下拉框,可以通过“Open SSH Configuration File”来查看相关的配置文件,需要建立连接,我一般使用“Connect Current Window to Host”。
如果查看配置文件,可以看到以下内容。这里Host是自己编辑的主机名,HostName则为主机号(填写你要连接的虚拟机即可),User填写登录虚拟机的用户名。
如果点击连接,则看到以下内容。如果完成了上面的配置,应该可以在这里看到主机名,也可以通过“Add New SSH Host”添加新的连接,形式参照提示输入“ssh 用户名@虚拟机IP”即可,之后会需要你保存相关配置信息,选择第一个的位置(User目录下的.ssh)即可。
3.然后便有个界面需要你输入密码,输入后点击回车即可完成连接。连接完成后,可以直接在vscode里面打开终端,即可看到linux 的命令行窗口。
建立SSH免密连接
首先我们需要在虚拟机上生成ssh密钥,输入以下命令
ssh-keygen
然后一路选择默认配置(狂按回车即可),然后便可以生成一对密钥和公钥,通过以下命令将本机的公钥放到authorized_keys中,便可以实现本机的免密ssh登录。
cd ~/.ssh
cat id_rsa.pub >> authorized_keys
sudo chmod 600 authorized_keys
sudo chmod 700 ~/.ssh
sudo service sshd restart
查看window本机的id_rsa.pub(如果没有的话,则在cmd上用“ssh-keygen”命令生成),并将其内容拷贝到虚拟机上的authorized_keys中,然后在终端输入“sudo service sshd restart”命令重启Linux的ssh服务,就可以发现vscode也可以免密登录到虚拟机了。(可能连接时会让你输入密码,直接回车即可自动连接)
配置VSCode上C的编译环境
安装相关插件
需要在虚拟机上安装的插件有以下几个插件。主要需要用到前面三个,后面的有一些是方便我个人使用,以及因为OS课设需要而安装的。
安装编译工具
我们需要在虚拟机上配置好可用的C++/C环境,要使用以下命令检查Linux虚拟机上是否有安装g++、gdb、gcc等编译调试程序所需的工具:
sudo apt install g++
sudo apt install gdb
sudo apt install gcc
创建工程文件夹
在虚拟机上创建一个文件夹,在vscode上打开,在里面创建.vscode文件夹,然后将下面三个json文件放入.vscode文件夹即可运行简单的程序了。
c_cpp_properties.json
{
"configurations": [
{
"name": "Linux",
"includePath": [
"${workspaceFolder}/**"
],
"defines": [],
"compilerPath": "/usr/bin/gcc",
"cStandard": "gnu17",
"cppStandard": "gnu++14",
"intelliSenseMode": "linux-gcc-x64"
}
],
"version": 4
}
launch.json
{
"version": "0.2.0",
"configurations": [
{
"name": "g++ - 生成和调试活动文件",
"type": "cppdbg",
"request": "launch",
"program": "${fileDirname}/${fileBasenameNoExtension}",
"args": [],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"setupCommands": [
{
"description": "为 gdb 启用整齐打印",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
],
"preLaunchTask": "C/C++: g++ 生成活动文件",
"miDebuggerPath": "/usr/bin/gdb"
}
]
}
tasks.json
{
"tasks": [
{
"type": "cppbuild",
"label": "C/C++: g++ 生成活动文件",
"command": "/usr/bin/g++",
"args": [
"-g",
"${file}",
"-o",
"${fileDirname}/${fileBasenameNoExtension}"
],
"options": {
"cwd": "${workspaceFolder}"
},
"problemMatcher": [
"$gcc"
],
"group": {
"kind": "build",
"isDefault": true
},
"detail": "调试器生成的任务。"
}
],
"version": "2.0.0"
}
搭建好的环境截图
在完成上述步骤之后,即可在该工程文件夹下创建一个test.c文件,运行编译即可成功。