【嵌入式】——Linux系統遠程操作和程序編譯

目錄

一、虛擬機配置網絡設置

?二、使用PuTTY登錄新建的賬戶

1、在ubuntu下開啟ssh服務

2、使用PuTTY連接

三、樹莓派實現遠程登錄

四、樹莓派使用VNC viewer登錄

五、Linux使用talk聊天程序

?1、使用linux自帶的talk命令

2、使用c語言編寫一個talk程序


一、虛擬機配置網絡設置

(1)將網絡適配器改為橋接模式?(“虛擬機” ——> “設置”)

(2)點擊編輯-> 虛擬網絡編輯器

進去過后點擊更改配置,進入下圖界面

?(3)創建一個新用戶

sudo adduser classmate1
sudo usermod -aG sudo classmate1

自己設置密碼

(4)登錄新設置的用戶,查看ip地址

su classmate1
ifconfig

?二、使用PuTTY登錄新建的賬戶

1、在ubuntu下開啟ssh服務

sudo apt-get install ssh
service ssh start
service ssh status

開啟后可以讓其它同學ping一下ip地址

2、使用PuTTY連接

配置PuTTY

?在配置選項 connection -> SSH -> Auth -> X11 forwarding 處,將 Enable X11 forwarding 打鉤

然后?session->host name?處填寫服務器IP?地址(即Ubuntu的IP地址),再點擊?open?連接遠程服務器

之后輸入用戶名和密碼進行登錄

?連接成功后,輸入命令?set DISPLAY=xxx.xxx.xxx.xxx:0?,(xxx.xxx.xxx.xxx是你所使用電腦windows下配置的IP地址)

三、樹莓派實現遠程登錄

運行putty,在配置選項 connection -> SSH -> Auth -> X11 forwarding 處,將 Enable X11 forwarding 打鉤;然后 session->host name 處填寫服務器IP地址,再點擊 open 連接 遠程服務器。

?用 putty 連接,打開 chromium 瀏覽器(輸入命令 chromium-browser)

四、樹莓派使用VNC viewer登錄

?輸入IP地址后使用賬號密碼登錄

五、Linux使用talk聊天程序

?1、使用linux自帶的talk命令

talk命令是一個用于Linux用戶之間交流的實時聊天程序。這個命令允許你和同一主機或不同主機上的其他用戶進行實時的對話。talk命令打開了一個發送窗口和一個接收窗口,使得你可以在鍵入自己的消息的同時看到對方的消息。它是一個視覺通訊程序,將你的終端上的行復制到另一個用戶的終端,就像一個即時通訊服務一樣。

talk person

然后等待對方回應即可?

2、使用c語言編寫一個talk程序

要實現一個支持 多客戶端聊天 的 Linux C 程序,我們可以使用 Socket 編程(基于 TCP/IP)讓多個客戶端連接到一個中央服務器,并實現實時消息轉發

功能說明

  1. 服務器

    • 監聽端口?8080,接受多個客戶端連接。

    • 使用?select()?實現多路復用,避免阻塞。

    • 將任一客戶端的消息廣播給所有其他客戶端。

  2. 客戶端

    • 連接服務器后,啟動一個線程專門接收消息。

    • 主線程負責發送用戶輸入的消息。

chat.c

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/wait.h>#define BUFFER_SIZE 1024int main() {int parent_to_child[2];  // 父進程→子進程的管道int child_to_parent[2];  // 子進程→父進程的管道char buffer[BUFFER_SIZE];// 創建管道if (pipe(parent_to_child) == -1 || pipe(child_to_parent) == -1) {perror("pipe failed");exit(EXIT_FAILURE);}pid_t pid = fork();if (pid == -1) {perror("fork failed");exit(EXIT_FAILURE);}if (pid == 0) {  // 子進程close(parent_to_child[1]);  // 關閉父→子的寫入端close(child_to_parent[0]);  // 關閉子→父的讀取端while (1) {// 讀取父進程消息ssize_t bytes_read = read(parent_to_child[0], buffer, BUFFER_SIZE);if (bytes_read <= 0) break;buffer[bytes_read] = '\0';printf("Child received: %s", buffer);// 發送回復給父進程printf("Child reply: ");fgets(buffer, BUFFER_SIZE, stdin);write(child_to_parent[1], buffer, strlen(buffer) + 1);}close(parent_to_child[0]);close(child_to_parent[1]);} else {  // 父進程close(parent_to_child[0]);  // 關閉父→子的讀取端close(child_to_parent[1]);  // 關閉子→父的寫入端while (1) {// 發送消息給子進程printf("Parent message: ");fgets(buffer, BUFFER_SIZE, stdin);write(parent_to_child[1], buffer, strlen(buffer) + 1);// 讀取子進程回復ssize_t bytes_read = read(child_to_parent[0], buffer, BUFFER_SIZE);if (bytes_read <= 0) break;buffer[bytes_read] = '\0';printf("Parent received: %s", buffer);}close(parent_to_child[1]);close(child_to_parent[0]);wait(NULL);  // 等待子進程結束}return 0;
}

?server.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <sys/select.h>#define MAX_CLIENTS 10
#define BUFFER_SIZE 1024int clients[MAX_CLIENTS] = {0};int main() {int server_fd, new_socket, max_sd, activity;struct sockaddr_in address;fd_set readfds;char buffer[BUFFER_SIZE];// 創建服務器 socketif ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {perror("socket failed");exit(EXIT_FAILURE);}address.sin_family = AF_INET;address.sin_addr.s_addr = INADDR_ANY;address.sin_port = htons(8080);// 綁定 socket 到端口if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) {perror("bind failed");exit(EXIT_FAILURE);}// 監聽連接if (listen(server_fd, 3) < 0) {perror("listen failed");exit(EXIT_FAILURE);}printf("Server started on port 8080. Waiting for connections...\n");while (1) {FD_ZERO(&readfds);FD_SET(server_fd, &readfds);max_sd = server_fd;// 添加所有客戶端 socket 到 fd_setfor (int i = 0; i < MAX_CLIENTS; i++) {if (clients[i] > 0) {FD_SET(clients[i], &readfds);if (clients[i] > max_sd) max_sd = clients[i];}}// 等待 socket 活動activity = select(max_sd + 1, &readfds, NULL, NULL, NULL);if (activity < 0) {perror("select error");continue;}// 處理新連接if (FD_ISSET(server_fd, &readfds)) {int addrlen = sizeof(address);if ((new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen)) < 0) {perror("accept failed");continue;}// 添加新客戶端for (int i = 0; i < MAX_CLIENTS; i++) {if (clients[i] == 0) {clients[i] = new_socket;printf("New client connected (socket %d)\n", new_socket);break;}}}// 處理客戶端消息for (int i = 0; i < MAX_CLIENTS; i++) {if (clients[i] > 0 && FD_ISSET(clients[i], &readfds)) {int bytes_read = read(clients[i], buffer, BUFFER_SIZE);if (bytes_read == 0) {  // 客戶端斷開printf("Client %d disconnected\n", clients[i]);close(clients[i]);clients[i] = 0;} else {  // 廣播消息buffer[bytes_read] = '\0';printf("Broadcasting: %s", buffer);for (int j = 0; j < MAX_CLIENTS; j++) {if (clients[j] > 0 && j != i) {send(clients[j], buffer, strlen(buffer), 0);}}}}}}return 0;
}

client.cclient.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <pthread.h>#define BUFFER_SIZE 1024void *receive_handler(void *arg) {int sock = *(int *)arg;char buffer[BUFFER_SIZE];while (1) {int bytes_read = read(sock, buffer, BUFFER_SIZE);if (bytes_read <= 0) {printf("Server disconnected\n");exit(EXIT_FAILURE);}buffer[bytes_read] = '\0';printf("Received: %s", buffer);}
}int main() {int sock;struct sockaddr_in server_addr;pthread_t recv_thread;char buffer[BUFFER_SIZE];// 創建客戶端 socketif ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {perror("socket failed");exit(EXIT_FAILURE);}server_addr.sin_family = AF_INET;server_addr.sin_port = htons(8080);// 將 IP 地址從字符串轉換為二進制形式if (inet_pton(AF_INET, "127.0.0.1", &server_addr.sin_addr) <= 0) {perror("invalid address");exit(EXIT_FAILURE);}// 連接服務器if (connect(sock, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) {perror("connect failed");exit(EXIT_FAILURE);}printf("Connected to server. Start chatting!\n");// 創建線程接收消息pthread_create(&recv_thread, NULL, receive_handler, (void *)&sock);// 主線程發送消息while (1) {fgets(buffer, BUFFER_SIZE, stdin);send(sock, buffer, strlen(buffer), 0);}close(sock);return 0;
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/79631.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/79631.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/79631.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

春和景明-C語言簡單代碼

題目要求&#xff1a; 請在centOS Linux中編寫一個C語言程序實現如下功能&#xff1a; 同時創建100個用戶&#xff0c;用戶的賬戶名稱為&#xff1a;Student01 Student02 … Student100;設置每個用戶的初始密碼為&#xff1a;stud123456請用gcc編譯C的源代碼&#xff0c;生…

設計模式之工廠模式(factory pattern):在商品對象創建系統中的應用

目錄 一、設計思路 1. 簡單工廠模式 2. 工廠方法模式 3. 抽象工廠模式 二、UML類圖&#xff08;PlantUML格式&#xff09; 1.簡單工廠模式 2.工廠方法模式 3.抽象工廠模式 三、實現過程與結果 1. 簡單工廠模式 2. 工廠方法模式 3. 抽象工廠模式 四、總結 在面向對…

Trae,字節跳動推出的 AI 編程助手插件

Trae 插件是 Trae 旗下全新一代的人工智能編程助手&#xff08;前身為 MarsCode 編程助手&#xff09;&#xff0c;以插件形式集成在本地開發環境中&#xff0c;具備極高的兼容性和靈活性&#xff0c;旨在提升開發效率和代碼質量。它支持超過100種編程語言&#xff0c;兼容主流…

工作紀實_63-Mac電腦使用brew安裝軟件

最近在接觸kafka&#xff0c;想著在自己的電腦安裝一套環境&#xff0c;docker也能行&#xff0c;但是還是想裝一些原生的軟件試試看&#xff0c;因此便想著整理一下brew的命令&#xff0c;這命令確實是方便&#xff0c;不需要下載tar包亂八七糟的東西&#xff0c;一鍵安裝 bre…

Python語法系列博客 · 第8期[特殊字符] Lambda函數與高階函數:函數式編程初體驗

上一期小練習解答&#xff08;第7期回顧&#xff09; ? 練習1&#xff1a;找出1~100中能被3或5整除的數 result [x for x in range(1, 101) if x % 3 0 or x % 5 0]? 練習2&#xff1a;生成字符串長度字典 words ["apple", "banana", "grape…

Redis--主從復制

目錄 一、配置 1.1 建立復制 1.2 斷開復制 1.3 安全性 1.4 只讀 1.5 傳輸延遲 二、拓撲 2.1 一主一從結構 2.2 一主多從結構 2.3 樹形主從結構 在分布式系統中為了解決單點問題&#xff0c;通常會把數據復制多個副本部署到其他服務器&#xff0c;滿足故障恢 復和負載均衡等需求…

已注冊商標如何防止被不使用撤銷!

近年來已注冊商標被撤銷越來越多&#xff0c;不乏著名企業或機構&#xff0c;普推知產商標老楊看到前一陣看到央視和百度等申請的商標也被申請撤銷&#xff0c;連續三年不使用撤銷也是正常的商標流程。 已注冊商標被撤銷普推老楊看到案例主要是集中在一些早期申請注冊的好記的商…

解密大模型背后的秘密:訓練、優化與挑戰

解密大模型背后的秘密&#xff1a;訓練、優化與挑戰 在當今的人工智能領域&#xff0c;大模型&#xff08;Large Language Models, LLMs&#xff09;已經成為了一個不可忽視的存在。從自然語言處理到圖像生成&#xff0c;再到推薦系統&#xff0c;大模型以其強大的泛化能力和創…

App自動化測試流程方案與架構設計

App自動化測試流程方案與架構設計 一、核心流程設計 #mermaid-svg-kN4GmIvHb8MMT83M {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-kN4GmIvHb8MMT83M .error-icon{fill:#552222;}#mermaid-svg-kN4GmIvHb8MMT83M .e…

字節跳動發布視頻生成基礎大模型 Seaweed-7B

近日&#xff0c;字節跳動發布了其全新視頻生成基礎大模型 Seaweed-7B&#xff0c;該模型由字節 Seed 團隊開發&#xff0c;參數量僅為 70 億&#xff0c;在多個方面展現出卓越性能&#xff0c;為 AI 視頻生成領域帶來了新的突破。 功能特點 支持多種生成方式&#xff1a;Sea…

如何基于區塊鏈進行虛擬電廠運營平臺建設?

本項目旨在基于區塊鏈技術建設虛擬電廠運營平臺&#xff0c;以提升省內大用戶及工業企業和工業園區的需求響應能力&#xff0c;優化能源結構配置&#xff0c;并推動能源交易、需求響應和現貨交易等新型業態的發展。通過建設虛擬電廠&#xff0c;項目將實現工業企業及園區各供用…

LeetCode[459]重復的子字符串(KMP解法)

思路&#xff1a; 最近迷上了KMP算法&#xff0c;所以這道題也是來搞一下KMP算法&#xff0c;總所周知KMP是需要維護一個前綴表&#xff0c;KMP算法不是比較一個字符串包不包含另一個字符串的嗎&#xff0c;這個重復字符串的題也能用&#xff1f;貓爺&#xff1a;毋庸置疑&…

spring-batch批處理框架(2)

文章目錄 八、作業控制8.1 作業啟動8.1.1 SpringBoot 啟動8.1.2 Spring 單元測試啟動8.1.3 RESTful API 啟動 8.2 作業停止方案1&#xff1a;Step 步驟監聽器方式方案2&#xff1a;StepExecution停止標記 8.3 作業重啟8.3.1 禁止重啟8.3.2 限制重啟次數8.3.3 無限重啟 九、Item…

uniapp的通用頁面及組件基本封裝

1.基本布局頁面 適用于自定義Navbar頭部 <template><view :style"{ background : param.bgColor , height: 100% }"><block v-if"param.noHead"><slot name"head"></slot></block><block v-if"!p…

基于MTF的1D-2D-CNN-GRU-Attention時序圖像多模態融合的故障識別,適合研究學習(Matlab完整源碼和數據),附模型研究報告

基于MTF的1D-2D-CNN-GRU-Attention時序圖像多模態融合的故障識別&#xff0c;適合研究學習&#xff08;Matlab完整源碼和數據&#xff09;&#xff0c;附模型研究報告 目錄 基于MTF的1D-2D-CNN-GRU-Attention時序圖像多模態融合的故障識別&#xff0c;適合研究學習&#xff08;…

HTTP/1.1 隊頭堵塞問題

文章目錄 一、隊頭堵塞1、非管線化2、管線化 二、如何解決&#xff1f; 一、隊頭堵塞 1、非管線化 如圖&#xff0c;http 請求必須等到上一個請求響應后才能發送&#xff0c;后面的以此類推&#xff0c;由此可以看出&#xff0c;在一個 tcp 通道中&#xff0c;如果某個 http 請…

施磊老師基于muduo網絡庫的集群聊天服務器(二)

文章目錄 Cmake簡單介紹Cmake與MakefileCmake配置CmakeLists.txt 編寫完整cmake例子文件夾雜亂問題多級目錄Cmakevscode 極其推薦 的 cmake方式 Mysql環境與編程mysql簡單使用User表Friend表AllGroup表GroupUser表OfflineMessage表 集群聊天項目工程目錄創建網絡模塊代碼Chatse…

4.18---緩存相關問題(操作原子性,擊穿,穿透,雪崩,redis優勢)

為什么要用redis做一層緩存&#xff0c;相比直接查mysql有什么優勢&#xff1f; 首先介紹Mysql自帶緩存機制的問題&#xff1a; MySQL 的緩存機制存在一些限制和問題,它自身帶的緩存功能Query Cache只能緩存完全相同的查詢語句&#xff0c;對于稍有不同的查詢語句&#xff0c…

健康養生指南

在快節奏的現代生活中&#xff0c;健康養生成為人們關注的焦點。它不僅關乎身體的強健&#xff0c;更是提升生活質量、預防疾病的關鍵。掌握科學的養生方法&#xff0c;能讓我們在歲月流轉中始終保持活力。 飲食是健康養生的基礎。遵循 “均衡膳食” 原則&#xff0c;每日飲食需…

#去除知乎中“鹽選”付費故事

添加油猴腳本&#xff0c;去除知乎中“鹽選”付費故事 // UserScript // name 鹽選內容隱藏腳本 // namespace http://tampermonkey.net/ // version 0.2 // description 自動隱藏含有“鹽選專欄”或“鹽選”文字的回答卡片 // author YourName // mat…