一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - C/C++ - Vscode搭建遠程c開發(fā)環(huán)境的圖文教程

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

2022-03-05 17:42涼曉風 C/C++

很久沒有寫C語言了,今天抽空學習下C語言知識,接下來通過本文給大家介紹Vscode搭建遠程c開發(fā)環(huán)境的詳細步驟,本文通過圖文實例代碼相結合給大家介紹的非常詳細,需要的朋友參考下吧

基礎環(huán)境

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

 

遠程開發(fā)套件

本機和目標機都需要安裝。

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

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

 

建立c文件

#include <stdio.h>
#include <stdlib.h>	
#include <unistd.h>	//系統(tǒng)函數
#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);	//將主機字節(jié)順序轉為網絡字節(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_ */

 

配置編譯任務

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

仍然保證 編輯區(qū)打開的是main.c文件,然后點擊菜單欄 運行->添加配置,系統(tǒng)會自動建立一個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": [],//環(huán)境變量 
          "externalConsole": false,//調試時是否顯示控制臺窗口 
          "MIMode": "gdb",//指定連接的調試器,可以為gdb或lldb 
          "setupCommands": [
              {
                  "description": "為 gdb 啟用整齊打印",
                  "text": "-enable-pretty-printing",
                  "ignoreFailures": true
              }
          ],
          "preLaunchTask": "C/C++: gcc 生成活動文件",//調試開始前執(zhí)行的任務,一般為編譯程序 對應 tasks.json中的label
          "miDebuggerPath": "/usr/bin/gdb"
      }
  ]
} 
  • 默認內容和我貼出來的略有不同,我增加了一些參數
  • launch.json 文件用來告訴vscode怎么調用gdb去調試,指定了一些參數,
  • preLaunchTask:調試開始前執(zhí)行的任務,一般為編譯程序 對應 tasks.json中的label
  • stopAtEntry": true,//是否停留在main函數
  • “args”: [“tcp_connect”,“192.168.1.201”,“8888”],//調試時傳遞給程序的命令行參數 比如我調試這個函數需要在命令行輸入,也就是標準輸入 輸入一些參數,那么填在這里

 

開始編譯

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

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

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

 

開始調試

打開 vscode 側邊欄 選擇調試標簽

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

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

點擊綠色箭頭,或者按F5 進入調試。

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

 

注意

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

 

參考資料

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

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

原文鏈接:https://blog.csdn.net/liangcsdn111/article/details/121522361

延伸 · 閱讀

精彩推薦
  • C/C++c++ 單線程實現同時監(jiān)聽多個端口

    c++ 單線程實現同時監(jiān)聽多個端口

    這篇文章主要介紹了c++ 單線程實現同時監(jiān)聽多個端口的方法,幫助大家更好的理解和學習使用c++,感興趣的朋友可以了解下...

    源之緣11542021-10-27
  • C/C++深入理解goto語句的替代實現方式分析

    深入理解goto語句的替代實現方式分析

    本篇文章是對goto語句的替代實現方式進行了詳細的分析介紹,需要的朋友參考下...

    C語言教程網7342020-12-03
  • C/C++C/C++經典實例之模擬計算器示例代碼

    C/C++經典實例之模擬計算器示例代碼

    最近在看到的一個需求,本以為比較簡單,但花了不少時間,所以下面這篇文章主要給大家介紹了關于C/C++經典實例之模擬計算器的相關資料,文中通過示...

    jia150610152021-06-07
  • C/C++C語言實現電腦關機程序

    C語言實現電腦關機程序

    這篇文章主要為大家詳細介紹了C語言實現電腦關機程序,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    xiaocaidayong8482021-08-20
  • C/C++C語言中炫酷的文件操作實例詳解

    C語言中炫酷的文件操作實例詳解

    內存中的數據都是暫時的,當程序結束時,它們都將丟失,為了永久性的保存大量的數據,C語言提供了對文件的操作,這篇文章主要給大家介紹了關于C語言中文件...

    針眼_6702022-01-24
  • C/C++C++之重載 重定義與重寫用法詳解

    C++之重載 重定義與重寫用法詳解

    這篇文章主要介紹了C++之重載 重定義與重寫用法詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下...

    青山的青6062022-01-04
  • C/C++學習C++編程的必備軟件

    學習C++編程的必備軟件

    本文給大家分享的是作者在學習使用C++進行編程的時候所用到的一些常用的軟件,這里推薦給大家...

    謝恩銘10102021-05-08
  • C/C++詳解c語言中的 strcpy和strncpy字符串函數使用

    詳解c語言中的 strcpy和strncpy字符串函數使用

    strcpy 和strcnpy函數是字符串復制函數。接下來通過本文給大家介紹c語言中的strcpy和strncpy字符串函數使用,感興趣的朋友跟隨小編要求看看吧...

    spring-go5642021-07-02
主站蜘蛛池模板: 色老板在线免费观看 | 欧美日韩一区二区三区韩大 | 免费看男女污污完整版 | 日韩日韩日韩手机看片自拍 | 久久re亚洲在线视频 | 欧美成a人片免费看久久 | 深夜在线影院 | 调教开发新婚娇妻放荡 | 午夜久久久久久网站 | xxxxx性欧美| 日本日日黄 | 国产一卡2卡3卡四卡高清 | 国产精品久久久久影院色老大 | 亚洲国产精品一区二区首页 | 晓雪老师我要进你里面好爽 | 韩国最新理论三级在线观看 | 亚洲第一永久色 | 亚洲无限 | 美女毛片视频 | 国产一区二区三区在线看片 | 91av最新地址| 成功精品影院 | 免费xxxx日本大片在线观看 | 欧美高清videosex极品 | 亚洲色欲色欲综合网站 | 欧美乱妇高清无乱码视频在线 | 1769亚洲资源站365在线 | 艾秋麻豆果冻剧传媒在线播放 | 欧美性另类69xxxx | 性欧美videofree中文字幕 | 美女班主任下面好爽好湿好紧 | 黄动漫车车好快的车车双女主 | 新版孕妇bbwbbwbbw | 亚洲午夜久久久久影院 | 成人免费福利网站在线看 | 单亲乱l仑在线观看免费观看 | 厨房play黄瓜进入 | www久久久| 亚洲激情网站 | 国产成人高清亚洲一区91 | 精品国产一级在线观看 |