当前位置: 首页 > news >正文

【嵌入式】——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.xdnf.cn/news/32509.html

相关文章:

  • 前端面试真题集合(一)
  • Python语法系列博客 · 第9期[特殊字符] 函数参数进阶:*args、**kwargs 与参数解包技巧
  • 树莓派5-开发应用笔记
  • Java Web 之 Tomcat 100问
  • git合并分支并推送
  • 为什么浮点数会搞出Infinity和NAN两种类型?浮点数的底层原理?IEEE 754标准揭秘?
  • matlab 环形单层柱状图
  • 解锁异步JavaScript性能:从事件循环(Event Loop)到Promise与Async/Await的最佳实践
  • 电商平台计算订单成交额是不是要去除退款退货的
  • CMFA在自动驾驶中的应用案例
  • 多线程使用——线程安全、线程同步
  • 【Canvas与旗帜】标准英国米字旗
  • 实现批量图片文字识别(python+flask+EasyOCR)
  • 系统架构设计师:计算机组成与体系结构(如CPU、存储系统、I/O系统)案例分析与简答题、详细解析与评分要点
  • 【C++动态规划】2801. 统计范围内的步进数字数目|2367
  • 洛谷P1177【模板】排序:十种排序算法全解(2)
  • Docker安装与介绍(一)
  • 【工具变量】A股上市公司信息披露质量KV指数测算数据集(含do代码 1991-2024年)
  • 青少年编程与数学 02-016 Python数据结构与算法 29课题、自然语言处理算法
  • 黑马Java基础笔记-1
  • 计算机网络——常见的网络攻击手段
  • 面试题之如何设计一个秒杀系统?
  • 编程语言基础 - C++ 面试题
  • jenkins尾随命令
  • word选中所有的表格——宏
  • ETF价格相关性计算算法深度分析
  • Java Stream 复杂场景排序与分组技术解析与示例代码
  • 蓝桥杯 蜗牛 动态规划
  • 遨游科普:防爆平板是指什么?有哪些应用场景?
  • 使用vue2技术写了一个纯前端的静态网站商城-鲜花销售商城