首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> C 語言問答

C語言實現遠程操作:Socket 網路程式設計正規軍指南 (拒絕木馬)

     編輯:C 語言問答

正確定位:C 語言網路程式設計 = Client/Server 架構 + Socket API

「遠程操作」本質是網路通訊:一端發送指令/數據,另一端接收執行並回傳結果。合法場景:遠程桌面 (RDP/VNC/SSH)、物聯網設備管理、分散式任務調度、遊戲伺服器、資料庫代理、微服務 RPC。嚴禁開發木馬/後門/未授權控制工具,違反《網絡安全法》《計算機信息系統安全保護條例》,構成犯罪。

核心技術棧

層級技術關鍵點
傳輸層TCP (可靠、有序、流式) / UDP (不可靠、無序、數據報)TCP 適合指令控制、檔案傳輸;UDP 適合即時音視頻、心跳、廣播發現
Socket APIBSD 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) 適合高頻交易/遊戲

最小化 TCP Echo Server 範例 (Linux, epoll, 非阻塞)

#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;
}

學習路徑建議

  1. 《Unix 網路程式設計 卷1:套接字聯網 API》 (UNPv1) —— 經典聖經,配合原始碼閱讀。
  2. 《Linux 高效能伺服器程式設計》 (游雙) —— Reactor/Proactor、線程池、定時器、日誌、配置、實戰架構。
  3. 《TCP/IP 詳解 卷1:協議》 (W. Richard Stevens) —— 協議細節、狀態機、重傳、滑動窗口、擁塞控制。
  4. 實戰專案:簡易 HTTP 靜態檔案伺服器 → 簡易 RPC 框架 (Protobuf + TCP) → 簡易分散式鍵值存儲 (Raft 共識)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved