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

C# Socket 通訊與多執行緒總結(五):執行緒銷毀、Socket 程式設計原理與 Unix 網路模型

     編輯:關於C語言

執行緒銷毀機制

方法行為注意事項
Thread.Abort()拋 ThreadAbortException,可被 catch,Thread.ResetAbort() 可取消不保證立即終止,finally 仍會執行
Thread.Interrupt()喚醒阻塞/睡眠執行緒,拋 ThreadInterruptedException非阻塞執行緒下次阻塞時才生效

Thread t = new Thread(Worker);
t.Start();
t.Abort();
t.Join(10000); // 等待最多 10 秒

Socket 程式設計原理:Unix I/O 模型

  • Open-Read/Write-Close:open() 取得檔案描述符 → read/write() 傳輸資料 → close() 釋放
  • 網路通訊同樣視為檔案描述符操作
  • BSD Socket / System V TLI 為兩大 Unix 網路 API 體系

進程間通訊 (IPC) 設施

體系機制
BSDPipe、Named Pipe、Signal
System VMessage Queue、Shared Memory、Semaphore

以上僅限本機進程間;跨主機需網路協定。

核心網路概念

Port(連接埠)

  • OS 可分配資源,識別通訊進程
  • TCP/UDP 各自獨立的 16-bit port space(相同 port number 不衝突)
  • Well-known ports < 1024(需 root/admin),Registered 1024-49151,Dynamic 49152-65535

Address(位址)三層尋址

  1. Network ID:不同網路識別
  2. Host ID:同網路內主機識別
  3. Port:主機內進程識別

TCP/IP:IP Address = Network ID + Host ID,16-bit Port 識別進程

Network Byte Order

  • Big-Endian(高位元組在前)
  • 協定標頭皆用 Network Order,跨平台一致
  • IPAddress.HostToNetworkOrder / NetworkToHostOrder 轉換

Socket 類型對照

類型協定特性應用
SOCK_STREAMTCP可靠、連線導向、位元組流、流控、無長度限制HTTP、FTP、SSH
SOCK_DGRAMUDP無連線、資料報、不可靠、可能丟包/重複/亂序DNS、NFS、串流
SOCK_RAWIP/ICMP繞過傳輸層,直接存取網路層ping、路由、防火牆

同步 Socket 伺服器範例


using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;

class Server {
    private Socket _socket;
    private Thread _thread;

    protected override void Dispose(bool disposing) {
        try { _socket?.Close(); _thread?.Abort(); } catch { }
        base.Dispose(disposing);
    }

    private static IPAddress GetLocalIP() =>
        Dns.GetHostEntry(Dns.GetHostName()).AddressList.First(ip => ip.AddressFamily == AddressFamily.InterNetwork);

    private void Listen() {
        var ep = new IPEndPoint(GetLocalIP(), 8000);
        _socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        _socket.Bind(ep);
        _socket.Listen(5);

        byte[] buffer = new byte[100];
        while (true) {
            try {
                var client = _socket.Accept();
                int recv = client.Receive(buffer);
                string msg = $"{DateTime.Now:T}: Message from {client.RemoteEndPoint}: {Encoding.Default.GetString(buffer, 0, recv)}";
                Console.WriteLine(msg);
                client.Close();
            } catch (SocketException ex) {
                Console.WriteLine($"Socket error: {ex.Message}");
            }
        }
    }

    public void Start() => _thread = new Thread(Listen) { IsBackground = true }.Start();
}

關鍵點提醒

  • Accept() 同步阻塞直到客戶端連線
  • 單執行緒迴圈一次只能處理一個客戶端,生產環境需非同步/多執行緒/IOCP
  • Dispose 中關閉 Socket + Abort 執行緒,避免資源洩漏
  • 編碼統一:傳輸端 Encoding.UTF8,接收端對應解碼
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved