執行緒銷毀機制
| 方法 | 行為 | 注意事項 |
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) 設施
| 體系 | 機制 |
| BSD | Pipe、Named Pipe、Signal |
| System V | Message 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(位址)三層尋址
- Network ID:不同網路識別
- Host ID:同網路內主機識別
- Port:主機內進程識別
TCP/IP:IP Address = Network ID + Host ID,16-bit Port 識別進程
Network Byte Order
- Big-Endian(高位元組在前)
- 協定標頭皆用 Network Order,跨平台一致
IPAddress.HostToNetworkOrder / NetworkToHostOrder 轉換
Socket 類型對照
| 類型 | 協定 | 特性 | 應用 |
| SOCK_STREAM | TCP | 可靠、連線導向、位元組流、流控、無長度限制 | HTTP、FTP、SSH |
| SOCK_DGRAM | UDP | 無連線、資料報、不可靠、可能丟包/重複/亂序 | DNS、NFS、串流 |
| SOCK_RAW | IP/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,接收端對應解碼