最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Vscode搭建遠程c開發(fā)環(huán)境的圖文教程

 更新時間:2021年11月26日 11:15:59   作者:涼曉風(fēng)  
很久沒有寫C語言了,今天抽空學(xué)習(xí)下C語言知識,接下來通過本文給大家介紹Vscode搭建遠程c開發(fā)環(huán)境的詳細步驟,本文通過圖文實例代碼相結(jié)合給大家介紹的非常詳細,需要的朋友參考下吧

基礎(chǔ)環(huán)境

  • 目標(biāo)機:ubuntu20
  • 開發(fā)機:win10、mac 安裝

遠程開發(fā)套件

本機和目標(biāo)機都需要安裝。

請?zhí)砑訄D片描述

參考 vscode 免密登錄服務(wù)器編輯配置服務(wù)器信息,用vscode打開遠程電腦的一個目錄。

建立c文件

#include <stdio.h>
#include <stdlib.h>	
#include <unistd.h>	//系統(tǒng)函數(shù)
#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數(shù)據(jù)函數(shù).
 * 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);	//關(guān)閉通道
			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);
 
	/*
	 * 填充服務(wù)器sockaddr結(jié)構(gòu)
	 */
	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地址轉(zhuǎn)化為用于網(wǎng)絡(luò)傳輸?shù)亩M制數(shù)值
	s_tcp_client.server_socket_addr.sin_port				= htons(s_tcp_client.server_port);	//將主機字節(jié)順序轉(zhuǎn)為網(wǎng)絡(luò)字節(jié)順序
	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_ */

配置編譯任務(wù)

進入 'main.c'文件,然后點擊菜單欄 終端->配置默認生成任務(wù),系統(tǒng)會自動建立一個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 定義該任務(wù)的名稱,后續(xù)調(diào)試會根據(jù)該名稱調(diào)用本任務(wù),這里名為C/C++: gcc 生成活動文
  • args :編譯時的參數(shù),比如假設(shè)程序依賴 pthread庫,,那么在這里指定,這里和手動在命令行輸入 gcc xxx 命令相同
  • cwd:指定當(dāng)前運行路徑 配置調(diào)試程序

仍然保證 編輯區(qū)打開的是main.c文件,然后點擊菜單欄 運行->添加配置,系統(tǒng)會自動建立一個launch.json文件,如下

{
    // 使用 IntelliSense 了解相關(guān)屬性。 
    // 懸停以查看現(xiàn)有屬性的描述。
    // 欲了解更多信息,請訪問: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "gcc - 生成和調(diào)試活動文件",
            "type": "cppdbg",
            "request": "launch",
            "program": "${fileDirname}/${fileBasenameNoExtension}",
            "args": ["tcp_connect","192.168.1.201","8888"],//調(diào)試時傳遞給程序的命令行參數(shù) 
            "stopAtEntry": true,//是否停留在main函數(shù)
            "cwd": "${fileDirname}",//調(diào)試程序時的工作目錄 
            "environment": [],//環(huán)境變量 
            "externalConsole": false,//調(diào)試時是否顯示控制臺窗口 
            "MIMode": "gdb",//指定連接的調(diào)試器,可以為gdb或lldb 
            "setupCommands": [
                {
                    "description": "為 gdb 啟用整齊打印",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                }
            ],
            "preLaunchTask": "C/C++: gcc 生成活動文件",//調(diào)試開始前執(zhí)行的任務(wù),一般為編譯程序 對應(yīng) tasks.json中的label
            "miDebuggerPath": "/usr/bin/gdb"
        }
    ]
} 
  • 默認內(nèi)容和我貼出來的略有不同,我增加了一些參數(shù)
  • launch.json 文件用來告訴vscode怎么調(diào)用gdb去調(diào)試,指定了一些參數(shù),
  • preLaunchTask:調(diào)試開始前執(zhí)行的任務(wù),一般為編譯程序 對應(yīng) tasks.json中的label
  • stopAtEntry": true,//是否停留在main函數(shù)
  • “args”: [“tcp_connect”,“192.168.1.201”,“8888”],//調(diào)試時傳遞給程序的命令行參數(shù) 比如我調(diào)試這個函數(shù)需要在命令行輸入,也就是標(biāo)準(zhǔn)輸入 輸入一些參數(shù),那么填在這里

開始編譯

仍然保證 編輯區(qū)打開的是main.c文件,

點擊菜單欄終端->運行生成任務(wù) 或者 ctrl+shift+b

請?zhí)砑訄D片描述

開始調(diào)試

打開 vscode 側(cè)邊欄 選擇調(diào)試標(biāo)簽

請?zhí)砑訄D片描述

觀察 綠色三角箭頭 右側(cè)的名稱,與launch.json中name`一致。

點擊綠色箭頭,或者按F5 進入調(diào)試。

請?zhí)砑訄D片描述

注意

在生成配置,或者調(diào)試時,一定要保證當(dāng)前編輯器打開的是待調(diào)試的c文件,而不是新建的launch.json或者tasks.json

參考資料

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

到此這篇關(guān)于Vscode搭建遠程c開發(fā)環(huán)境的文章就介紹到這了,更多相關(guān)Vscode搭建遠程內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++實現(xiàn)線性代數(shù)矩陣行簡化

    C++實現(xiàn)線性代數(shù)矩陣行簡化

    這篇文章主要為大家詳細介紹了C++實現(xiàn)線性代數(shù)矩陣行簡化,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-02-02
  • 關(guān)于C語言 const 和 define 區(qū)別

    關(guān)于C語言 const 和 define 區(qū)別

    這篇文章主要介紹了關(guān)于C語言 const 和 define 區(qū)別 的相關(guān)資料,需要的朋友可以參考下面文章內(nèi)容
    2021-09-09
  • C語言楊輝三角兩種實現(xiàn)方法

    C語言楊輝三角兩種實現(xiàn)方法

    大家好,本篇文章主要講的是C語言楊輝三角兩種實現(xiàn)方法,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • C++ STL標(biāo)準(zhǔn)庫std::vector的使用詳解

    C++ STL標(biāo)準(zhǔn)庫std::vector的使用詳解

    vector 是表示可以改變大小的數(shù)組的序列容器,本文主要介紹了C++ STL標(biāo)準(zhǔn)庫std::vector的使用詳解,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • 一篇文章徹底搞懂C++常見容器

    一篇文章徹底搞懂C++常見容器

    容器就是一些特定類型對象的集合,容器可以分為順序容器和關(guān)聯(lián)容器,下面這篇文章主要給大家介紹了關(guān)于C++常見容器的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-02-02
  • C語言單鏈隊列的表示與實現(xiàn)實例詳解

    C語言單鏈隊列的表示與實現(xiàn)實例詳解

    這篇文章主要介紹了C語言單鏈隊列的表示與實現(xiàn),對于研究數(shù)據(jù)結(jié)構(gòu)與算法的朋友來說很有參考借鑒價值,需要的朋友可以參考下
    2014-07-07
  • 基于WTL中使用雙緩沖避免閃爍的解決方法

    基于WTL中使用雙緩沖避免閃爍的解決方法

    本篇文章是對WTL中使用雙緩沖避免閃爍的解決方法進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • 《C++ primer plus》讀書筆記(三)

    《C++ primer plus》讀書筆記(三)

    本文是C++讀書筆記系列的第三篇,是讀完《C++ primer plus》一書第九、十兩章記錄下來的筆記,學(xué)習(xí)C++的同學(xué)可以看看參考下。
    2014-10-10
  • C++使用TinyXML解析XML

    C++使用TinyXML解析XML

    本文詳細講解了C++使用TinyXML解析XML的方法,文中通過示例代碼介紹的非常詳細。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-12-12
  • Visual Studio 2019配置OpenCV4.1.1詳細圖解教程

    Visual Studio 2019配置OpenCV4.1.1詳細圖解教程

    這篇文章主要介紹了Visual Studio 2019配置OpenCV4.1.1詳細圖解教程 ,需要的朋友可以參考下
    2020-02-02

最新評論

德江县| 视频| 溧水县| 彰化市| 邳州市| 芮城县| 山西省| 淅川县| 灌南县| 璧山县| 佳木斯市| 平塘县| 阆中市| 棋牌| 常德市| 科尔| 辰溪县| 二手房| 龙泉市| 永宁县| 喀喇沁旗| 泾阳县| 宽甸| 金秀| 左云县| 珲春市| 丰城市| 渝中区| 康保县| 赤城县| 基隆市| 华坪县| 朝阳区| 景洪市| 富蕴县| 莆田市| 淮北市| 溧阳市| 房产| 江达县| 沅江市|