Vscode搭建远程c开发环境的图文教程

目录
  • 基础环境
  • 远程开发套件
  • 建立c文件
  • 配置编译任务
  • 开始编译
  • 开始调试
  • 注意
  • 参考资料

基础环境

  • 目标机:ubuntu20
  • 开发机:win10、mac 安装

远程开发套件

本机和目标机都需要安装。

参考 vscode 免密登录服务器编辑配置服务器信息,用vscode打开远程电脑的一个目录。

建立c文件

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>	//系统函数
#include <string.h>
#include <pthread.h>	//多线程库

#include "net_control_client.h"

ts_tcp_client s_tcp_client;

static int connect_to_server(void)
{
	while(connect(s_tcp_client.socket_fd, (struct sockaddr *) &(s_tcp_client.server_socket_addr),
			sizeof(struct sockaddr)) != 0){
		//if connect error reconnect after 5 seconds
		perror("connect");
		printf("***reconnect after 5s***\n");
		sleep(5);
		printf("***reconnect...***\n");
	}
	printf("***connected***\n");
#if 1//test message send
    sleep(1);
	char test_msg[] = "This is from client";
	send(s_tcp_client.socket_fd, test_msg ,sizeof(test_msg),0);
#endif
	return 0;
}

/*
 * 接收socket数据函数.
 * client_fd - 客户端连接的socket。
 */
static int receive_packet(int client_fd)
{
	unsigned char 	buf[TCP_BUFFER_SIZE];
	int		recvbytes;
	while(1){
		/*接收*/
		bzero(buf,sizeof(buf));

		recvbytes = recv(client_fd,buf,TCP_BUFFER_SIZE,0);
		printf("Receive %d bytes\n",recvbytes);

		if (recvbytes <= 0){//receive error or disconnected
			perror("recv");
			/*reconnect to server*/
			printf("close socket id = %d\n", s_tcp_client.socket_fd);
			close(s_tcp_client.socket_fd);	//关闭通道
			s_tcp_client.socket_fd = socket(AF_INET, SOCK_STREAM, 0);
			if (s_tcp_client.socket_fd == -1){
                printf("###socket init error###\n");
				perror("socket");
				return -1;
			}
			printf("new socket id = %d\n", s_tcp_client.socket_fd);
			if (connect_to_server() != 0){
				printf("###connect_to_server error###\n");
				return -1;
			}
		}else{//receive success
#if 1//test
			int i;
			printf("***GET:\n");
			for (i = 0; i < recvbytes; i++){
				printf("0x%02X  %c\n", *(buf+i), *(buf+i));
			}
#endif
		}
	}
	return 0;
}
/*tcp clinet send thread*/
int tcp_send_start(void)
{
    char buf[100];
    uint32_t i = 0;

    while(1)
    {
        sleep(5);

        memset(buf,0,sizeof(buf));
        sprintf(buf,"***send data:hello world : %d\n",i);
        i++;
        printf("%s",buf);

        send(s_tcp_client.socket_fd, buf ,strlen(buf),0);
    }

}
/*tcp clinet running function*/
int tcp_client_start(void)
{
    pthread_t 	tcp_send_thread_id;//返回的线程值
	printf("***connect to %s:%d....***\n", s_tcp_client.server_ip,s_tcp_client.server_port);
	/*connect to server*/
	if (connect_to_server() != 0){
		printf("###connect_to_server error###\n");
		return -1;
	}

    //create thread for TCP send
	pthread_create(&tcp_send_thread_id, NULL, (void *)tcp_send_start, NULL);

	receive_packet(s_tcp_client.socket_fd);
	return 0;
}

/*
 * tcp_client initialize function
 * port_num -  TCP server port number
 * server_ip - TCP server ip
 * */
int tcp_client_init(unsigned short port_num, char *server_ip)
{
	int res;
	struct in_addr test_addr;
	/*initialize variable*/
	if (port_num > 0){
		s_tcp_client.server_port = port_num;
	}else{
		printf("###invalid tcp server port:%d###\n", port_num);
		return -1;
	}

	if (server_ip == NULL){
		printf("###server_ip cannot be NULL###\n");
		return -1;
	}else{
		strcpy(s_tcp_client.server_ip, server_ip);//record ip
	}
    printf("server ip is: %s\r\n",s_tcp_client.server_ip);

	/*建立socket描述符*/
	if ((s_tcp_client.socket_fd = socket(AF_INET, SOCK_STREAM, 0)) == -1){
		perror("socket");
		return -1;
	}
	printf("socket id = %d\n", s_tcp_client.socket_fd);

	/*
	 * 填充服务器sockaddr结构
	 */
	bzero(&(s_tcp_client.server_socket_addr), sizeof(struct sockaddr_in));	//memset
	s_tcp_client.server_socket_addr.sin_family		 	= AF_INET;
	inet_pton(AF_INET, s_tcp_client.server_ip, &(s_tcp_client.server_socket_addr.sin_addr.s_addr));	//把ip地址转化为用于网络传输的二进制数值
	s_tcp_client.server_socket_addr.sin_port				= htons(s_tcp_client.server_port);	//将主机字节顺序转为网络字节顺序
	bzero(&(s_tcp_client.server_socket_addr.sin_zero), 8);

	return 0;
}

int main(int argc, char *argv[])
{
	int i = 0;
	int res;
	pthread_t 	tcp_thread_id;//返回的线程值
	char tcp_server_port[256];
	char tcp_server_ip[256];
    printf("enter main\r\n");
	if (argc >= 2){
		if (strcmp(argv[1],"-v") == 0){
			printf("net_control_client v1.0\n");
			return 0;
		}else if (strcmp(argv[1],"-h") == 0){
			printf("-v for version\n");
			printf("-h for help\n");
			printf("tcp_connect <IP> <port>\n");
			return 0;
		}else if (strcmp(argv[1], "tcp_connect") == 0){
			/*tcp demo*/
			strcpy(tcp_server_ip, argv[2]);
			strcpy(tcp_server_port, argv[3]);

			/*initialize functions*/
			res = tcp_client_init((unsigned short)atoi(tcp_server_port), tcp_server_ip);//set tcp clinet setting
			if (res == -1){
				printf("###tcp_server_init error###\n");
				return -1;
			}

			//create thread for TCP communication
			pthread_create(&tcp_thread_id, NULL, (void *)tcp_client_start, NULL);
		}else{
			printf("Unknown argument %s\n",argv[1]);
			return -1;
		}
	}
    else{
        printf("please input ip and port\r\n");
        exit(0);
    }
	while(1){
		if (i < 100){
			i++;
		}else{
			i = 0;
		}
		sleep(1);
	}
	exit(0);
}

.h文件

#ifndef NET_CONTROL_CLINET_H_
#define NET_CONTROL_CLINET_H_

#include <arpa/inet.h>

#define TCP_BUFFER_SIZE	1024//max buff of receive buffer for tcp

typedef struct{//tcp client class
		unsigned short  	server_port;
		char 				server_ip[64];
		int 				socket_fd;//socket
		struct 				sockaddr_in server_socket_addr;
}ts_tcp_client;

#endif /* NET_CONTROL_CLINET_H_ */

配置编译任务

进入 'main.c'文件,然后点击菜单栏 终端->配置默认生成任务,系统会自动建立一个task.json文件,如下

{
	"version": "2.0.0",
	"tasks": [
		{
			"type": "cppbuild",
			"label": "C/C++: gcc 生成活动文件",
			"command": "/usr/bin/gcc",
			"args": [
				"-fdiagnostics-color=always",
				"-g",
				"${file}",
				"-o",
				"${fileDirname}/${fileBasenameNoExtension}",
				"-lpthread"
			],
			"options": {
				"cwd": "${fileDirname}"
			},
			"problemMatcher": [
				"$gcc"
			],
			"group": {
				"kind": "build",
				"isDefault": true
			},
			"detail": "编译器: /usr/bin/gcc"
		}
	]
}

task.json 用来告诉vscode 怎么去编译源文件main.c

  • lablel 定义该任务的名称,后续调试会根据该名称调用本任务,这里名为C/C++: gcc 生成活动文
  • args :编译时的参数,比如假设程序依赖 pthread库,,那么在这里指定,这里和手动在命令行输入 gcc xxx 命令相同
  • cwd:指定当前运行路径 配置调试程序

仍然保证 编辑区打开的是main.c文件,然后点击菜单栏 运行->添加配置,系统会自动建立一个launch.json文件,如下

{
    // 使用 IntelliSense 了解相关属性。
    // 悬停以查看现有属性的描述。
    // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "gcc - 生成和调试活动文件",
            "type": "cppdbg",
            "request": "launch",
            "program": "${fileDirname}/${fileBasenameNoExtension}",
            "args": ["tcp_connect","192.168.1.201","8888"],//调试时传递给程序的命令行参数
            "stopAtEntry": true,//是否停留在main函数
            "cwd": "${fileDirname}",//调试程序时的工作目录
            "environment": [],//环境变量
            "externalConsole": false,//调试时是否显示控制台窗口
            "MIMode": "gdb",//指定连接的调试器,可以为gdb或lldb
            "setupCommands": [
                {
                    "description": "为 gdb 启用整齐打印",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                }
            ],
            "preLaunchTask": "C/C++: gcc 生成活动文件",//调试开始前执行的任务,一般为编译程序 对应 tasks.json中的label
            "miDebuggerPath": "/usr/bin/gdb"
        }
    ]
} 
  • 默认内容和我贴出来的略有不同,我增加了一些参数
  • launch.json 文件用来告诉vscode怎么调用gdb去调试,指定了一些参数,
  • preLaunchTask:调试开始前执行的任务,一般为编译程序 对应 tasks.json中的label
  • stopAtEntry": true,//是否停留在main函数
  • “args”: [“tcp_connect”,“192.168.1.201”,“8888”],//调试时传递给程序的命令行参数 比如我调试这个函数需要在命令行输入,也就是标准输入 输入一些参数,那么填在这里

开始编译

仍然保证 编辑区打开的是main.c文件,

点击菜单栏终端->运行生成任务 或者 ctrl+shift+b

开始调试

打开 vscode 侧边栏 选择调试标签

观察 绿色三角箭头 右侧的名称,与launch.json中name`一致。

点击绿色箭头,或者按F5 进入调试。

注意

在生成配置,或者调试时,一定要保证当前编辑器打开的是待调试的c文件,而不是新建的launch.json或者tasks.json

参考资料

https://code.visualstudio.com/docs/cpp/config-linux

到此这篇关于Vscode搭建远程c开发环境的文章就介绍到这了,更多相关Vscode搭建远程内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • vscode配置远程开发环境并远程调试运行C++代码的教程

    之前的时候我写C/C++代码喜欢在Linux下用vim(一开始甚至都没装代码补全插件),后来入了Clion的坑,感觉IDE还是太方便了,但是毕竟还是有许多场景只能在Linux下完成,于是就经常还是需要用vim.gdb这些东西,用惯了IDE之后就觉得挺麻烦的.最近尝试了一下vscode的远程开发功能,就俩字:真香,写篇文章记录一下,以防我下次配置的时候忘记了. vscode配置远程开发环境 检查服务器是否安装ssh服务 服务器使用命令netstat -tanp查看是否存在sshd 一般这一步都不会

  • VSCode 搭建 Arm 远程调试环境的步骤详解

    简介 前提条件: 确保本机已经安装 VS Code. 确保本机已安装 SSH client, 并且确保远程主机已安装 SSH server. VSCode 已经安装了插件 C/C++. 本次搭建的环境: 主机:windows 10 服务器:ubuntu 16.04 VSCode 版本:February 2020 (version 1.43) Arm:海思 3559A (已配置好编译工具链和 gdb server) 连接远程主机 Remote Development 首先安装 Remote Dev

  • Vscode搭建远程c开发环境的图文教程

    目录 基础环境 远程开发套件 建立c文件 配置编译任务 开始编译 开始调试 注意 参考资料 基础环境 目标机:ubuntu20 开发机:win10.mac 安装 远程开发套件 本机和目标机都需要安装. 参考 vscode 免密登录服务器编辑配置服务器信息,用vscode打开远程电脑的一个目录. 建立c文件 #include <stdio.h> #include <stdlib.h> #include <unistd.h> //系统函数 #include <stri

  • CLion搭建配置C++开发环境的图文教程 (MinGW-W64 GCC-8.1.0)

    1.下载MinGW-W64 GCC 下载地址:MinGW-w64 - for 32 and 64 bit Windows - Browse Files at SourceForge.net MinGW各个版本区别: 我们这里下载MinGW-W64 GCC-8.1.0版本 等待下载完成: 解压到指定路径: 我们这里放到D盘路径下: 2. 下载CLion 下载地址:下载 CLion:适用于 C 和 C++ 的智能跨平台 IDE (jetbrains.com) 3. 安装CLion 4. 配置CLio

  • VirtualBox CentOS7.7.1908 Python3.8 搭建Scrapy开发环境【图文教程】

    环境 VirtualBox_v6.0.14 CentOS_v7.1908 Python_v3.8.0 MongoDB_v3.2.22 pip_v19.3.1 windows Pycharm-2019.2.3企业版(社区版不支持远程连接linux开发),需激活使用系统自带Python2.7.5不做处理,尝试过pyenv安装3.8,但是到安装scrapy的时候报错不断,最终又卸载了pyenv重新手动编译安装. 安装CentOS 为了保证虚拟机和宿主机能互相访问和正常通信,采用2虚拟网卡的配置方式.

  • VMware + Ubuntu18.04 搭建Hadoop集群环境的图文教程

    目录 前言 VMware克隆虚拟机(准备工作,克隆3台虚拟机,一台master,两台node) 1.创建Hadoop用户(在master,node1,node2执行) 2.更新apt下载源(在master,node1,node2执行) 3. 安装SSH.配置SSH免密登录 (在master,node1,node2执行) 4.安装Java环境 (在master,node1,node2执行) 修改主机名(在master,node1,node2执行) 修改IP映射(在master,node1,node

  • Golang搭建开发环境的图文教程

    Golang开发环境搭建 Go 语言开发包 国外:https://golang.org/dl/ 国内(推荐): https://golang.google.cn/dl/ 编辑器 Golang:https://www.jetbrains.com/go/  Visual Studio Code: https://code.visualstudio.com/ 搭建 Go 语言开发环境,需要先下载 Go 语言开发包. 查看操作系统及版本 Windows: Mac: Linux: 终端输入uname -a

  • VSCode搭建C/C++编译环境的详细教程

    Visual Studio Code (vscode)编译C++ Visual Studio Code (简称 VS Code / VSC) 是一款免费开源的现代化轻量级代码编辑器,支持几乎所有主流的开发语言的语法高亮.智能代码补全.自定义热键.括号匹配.代码片段.代码对比 Diff.GIT 等特性,可谓是微软的良心之作. 下载安装VS Code https://code.visualstudio.com/Download 安装cpptools插件 打开VS Code,快捷键ctrl+shift

  • Java程序开发环境配置图文教程

    1.前言 我学习Java已经将近一个月的时间了,从一个小白开始慢慢摸索,现在已经逐渐进入状态,学会了一些东西,故将自己从0开始的经历分享出来.我们要使用Java编写程序首先需要在计算机中搭建Java的开发环境,本文包含JDK的安装和Java编译环境配置的方法,不足之处请多多包含. 2.JDK的安装 JDK是 Java 语言的软件开发工具包,主要用于移动设备.嵌入式设备上的java应用程序.JDK是整个java开发的核心,它包含了JAVA的运行环境(JVM+Java系统类库)和JAVA工具,要进行

  • VScode上配置 c语言环境的图文教程

    成成最近用到C语言了,之前比较喜欢用在vscode上面用python调试,今天我参考了一些文章,也尝试了下在vscode上配置c语言的调试,其中包含一些相关的基础知识. 1.在vscode里面下载c/c++官方插件: 2.安装c/c++编译器: 在windows上借助MinGW工具安装,下载地址:[https://sourceforge.net/projects/mingw/ ] 安装在d:\MinGW 下就好(自己新建一个文件夹),然后打开后这个样子: 在里面找到mingw32-gcc.bin

  • Win10下android studio开发环境配置图文教程

    一.安装Java JDK 从JDK下载地址下载并安装,注意选择是x86还是x64版本. 在安装期间系统会出现两次选择安装文件夹的提示,第一次是安装"jdk",第二次则是安装"jre". 安装成功如上图所示. 二.添加环境变量 计算机→属性→高级系统设置→高级→环境变量,新建环境变量,命名为JAVA_HOME,变量值填入你安装jdk的路径. 在系统变量里寻找 Path 变量,选择编辑,新建两个变量值%JAVA_HOME%\bin,%JAVA_HOME%\jre\bin

  • Windows系统中搭建Go语言开发环境图文详解

    目录 1.Go语言简介 2.安装Git 3.Go 工具链(编译器)安装 3.1.环境变量GOROOT 3.2.环境变量GOPATH 3.3.Go常用命令 4.包管理 4.1.go module 4.2.gopm 5.编写Go语言代码的IDE或编辑工具 5.1.基于VSCode的Go开发环境 5.1.1.安装VSCode 5.1.2.安装插件 5.1.3.常用配置 5.2.GoLand 5.3.Vim 5.4.其他Go代码编写工具 6.Go语言学习资料分享 本文详细讲述如何在 Windows 系统

随机推荐