「遠程操作」本質是網路通訊:一端發送指令/數據,另一端接收執行並回傳結果。合法場景:遠程桌面 (RDP/VNC/SSH)、物聯網設備管理、分散式任務調度、遊戲伺服器、資料庫代理、微服務 RPC。嚴禁開發木馬/後門/未授權控制工具,違反《網絡安全法》《計算機信息系統安全保護條例》,構成犯罪。
| 層級 | 技術 | 關鍵點 |
|---|---|---|
| 傳輸層 | TCP (可靠、有序、流式) / UDP (不可靠、無序、數據報) | TCP 適合指令控制、檔案傳輸;UDP 適合即時音視頻、心跳、廣播發現 |
| Socket API | BSD Socket (POSIX) / Winsock (Windows) | `socket`、`bind`、`listen`、`accept`、`connect`、`send`/`recv`、`sendto`/`recvfrom`、`close`/`closesocket`、`select`/`poll`/`epoll`/`kqueue`/`IOCP` |
| 協議層 | 自定義二進制協議 / Protobuf / FlatBuffers / MessagePack / JSON / HTTP / WebSocket / gRPC | 二進制協議效能高、需處理粘包/拆包 (長度前綴/分隔符);文本協議易調試、穿透防火牆 |
| 並發模型 | 多進程 / 多執行緒 / 線程池 / 事件驅動 (Reactor/Proactor) / 協程 (libco/libgo/asio) | C10K/C10M 問題:epoll/kqueue/IOCP + 非阻塞 IO + 狀態機 |
| 安全層 | TLS 1.3 (OpenSSL/mbedTLS/wolfSSL) / DTLS / SSH 協議 / Kerberos / OAuth2 / JWT | 加密傳輸、身份認證、完整性校驗、防重放、前向保密 |
| 序列化/反序列化 | 手寫 / Protobuf-c / FlatBuffers / cJSON / simdjson | 零拷貝 (FlatBuffers/Cap'n Proto) 適合高頻交易/遊戲 |
#include <sys/epoll.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#define MAX_EVENTS 1024
#define BUF_SIZE 4096
int set_nonblocking(int fd) {
int flags = fcntl(fd, F_GETFL, 0);
return fcntl(fd, F_SETFL, flags | O_NONBLOCK);
}
int main() {
int listen_fd = socket(AF_INET, SOCK_STREAM, 0);
struct sockaddr_in addr = { .sin_family = AF_INET, .sin_port = htons(8888), .sin_addr.s_addr = INADDR_ANY };
bind(listen_fd, (struct sockaddr*)&addr, sizeof(addr));
listen(listen_fd, SOMAXCONN);
set_nonblocking(listen_fd);
int epfd = epoll_create1(0);
struct epoll_event ev = { .events = EPOLLIN, .data.fd = listen_fd };
epoll_ctl(epfd, EPOLL_CTL_ADD, listen_fd, &ev);
struct epoll_event events[MAX_EVENTS];
while (1) {
int n = epoll_wait(epfd, events, MAX_EVENTS, -1);
for (int i = 0; i < n; ++i) {
int fd = events[i].data.fd;
if (fd == listen_fd) {
while (1) {
int conn_fd = accept(listen_fd, NULL, NULL);
if (conn_fd == -1) break;
set_nonblocking(conn_fd);
struct epoll_event ev = { .events = EPOLLIN | EPOLLET, .data.fd = conn_fd };
epoll_ctl(epfd, EPOLL_CTL_ADD, conn_fd, &ev);
}
} else if (events[i].events & EPOLLIN) {
char buf[BUF_SIZE];
ssize_t n = read(fd, buf, sizeof(buf));
if (n > 0) {
write(fd, buf, n); // Echo back
} else if (n == 0 || (n == -1 && errno != EAGAIN)) {
close(fd);
epoll_ctl(epfd, EPOLL_CTL_DEL, fd, NULL);
}
}
}
}
return 0;
}