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

Linux P2P 聊天程式實作:Socket、fork 與訊號同步

     編輯:關於C語言

Linux P2P 聊天程式實作:Socket、fork 與訊號同步

本文實作一個基於 TCP 的點對點聊天小程式,展示 socket、fork 多進程並發、signal 進程同步退出的核心網路程式設計技術。

架構設計

  • Server:監聽埠 10001,accept 連線後 fork 子進程。
    • 父進程:read 接收客戶端訊息並輸出。
    • 子進程:fgets 讀取標準輸入並 write 發送。
  • Client:連線 Server,同樣 fork 兩進程分工收發。
    • 子進程:接收訊息輸出。
    • 父進程:讀取輸入發送。
  • 同步退出:任一方關閉連線(read 返回 0),以 SIGUSR1 殺死對應進程,雙向清理。

關鍵程式碼片段

Server 主流程

int listenfd = socket(AF_INET, SOCK_STREAM, 0);
setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));
bind(listenfd, (SA*)&servaddr, sizeof(servaddr));
listen(listenfd, SOMAXCONN);

int conn = accept(listenfd, (SA*)&peeraddr, &socklen);
pid_t pid = fork();
if (pid == 0) { // 子進程:發送
    signal(SIGUSR1, handler);
    while (fgets(sendbuf, sizeof(sendbuf), stdin))
        write(conn, sendbuf, strlen(sendbuf));
    exit(0);
} else { // 父進程:接收
    while (read(conn, recvbuf, sizeof(recvbuf)) > 0)
        fputs(recvbuf, stdout);
    kill(pid, SIGUSR1); // 通知子進程退出
    exit(0);
}

Client 主流程

int sockfd = socket(AF_INET, SOCK_STREAM, 0);
connect(sockfd, (SA*)&servaddr, sizeof(servaddr));
pid_t pid = fork();
if (pid == 0) { // 子進程:接收
    while (read(sockfd, recvbuf, sizeof(recvbuf)) > 0)
        fputs(recvbuf, stdout);
    kill(getppid(), SIGUSR1);
} else { // 父進程:發送
    signal(SIGUSR1, handler);
    while (fgets(sendbuf, sizeof(sendbuf), stdin))
        write(sockfd, sendbuf, strlen(sendbuf));
}

關鍵技術點解析

  1. fork 實現雙工通訊:單進程難以同時阻塞於 read (網路) 與 fgets (標準輸入),雙進程分工解決。
  2. read 返回值語義:>0 收到資料,=0 對方關閉連線(EOF),=-1 錯誤。
  3. SIGUSR1 自訂訊號:用於進程間通知退出,避免殭屍進程。
  4. SO_REUSEADDR:允許 Server 重啟時立即重用埠,避免 TIME_WAIT 等待。

編譯與測試

gcc server.c -o server
gcc client.c -o client
# 終端 1
./server
# 終端 2
./client
# 雙向輸入文字即可聊天,Ctrl+D 或關閉視窗退出

擴展方向

  • 使用 select/poll/epoll 替代多進程,支援高併發。
  • 加入訊息協議(長度前綴、JSON)實現結構化傳輸。
  • 整合 TLS (OpenSSL) 實現加密通訊。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved