目錄
一、虛擬機配置網絡設置
?二、使用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)讓多個客戶端連接到一個中央服務器,并實現實時消息轉發
功能說明
-
服務器:
-
監聽端口?
8080
,接受多個客戶端連接。 -
使用?
select()
?實現多路復用,避免阻塞。 -
將任一客戶端的消息廣播給所有其他客戶端。
-
-
客戶端:
-
連接服務器后,啟動一個線程專門接收消息。
-
主線程負責發送用戶輸入的消息。
-
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;
}