Socket.Send 多載完整簽章
// 1. 基本發送
public int Send(byte[] buffer);
// 2. 指定旗標
public int Send(byte[] buffer, SocketFlags flags);
// 3. 指定長度
public int Send(byte[] buffer, int size, SocketFlags flags);
// 4. 指定偏移與長度
public int Send(byte[] buffer, int offset, int size, SocketFlags flags);
SocketFlags 列舉
| 旗標 | 含義 |
| None | 預設行為 |
| DontRoute | 繞過路由表直接發送(本地網路) |
| OutOfBand | 帶外資料(TCP Urgent pointer) |
| Peek | 查看資料但不從緩衝區移除 |
| Partial | 允許部分發送(訊息模式) |
發送範例
Socket client = listener.Accept();
string msg = "Hello Socket";
byte[] data = Encoding.BigEndianUnicode.GetBytes(msg); // 或 UTF8
// 發送全部資料(需迴圈確保完整發送)
int totalSent = 0;
while (totalSent < data.Length) {
int sent = client.Send(data, totalSent, data.Length - totalSent, SocketFlags.None);
if (sent == 0) throw new Exception("Connection closed");
totalSent += sent;
}
NetworkStream 封裝發送
using (var stream = new NetworkStream(client, true)) { // true: Close 時關閉 Socket
byte[] data = Encoding.UTF8.GetBytes("Hello Stream");
stream.Write(data, 0, data.Length); // 同步寫入
// 或非同步
// await stream.WriteAsync(data, 0, data.Length);
}
NetworkStream 實作 Stream 抽象,支援 Read/Write、BeginRead/BeginWrite、ReadAsync/WriteAsync
- 自動處理部分發送/接收,簡化程式碼
- 建構函式
ownsSocket=true 時,Dispose() 會關閉底層 Socket
Socket.Receive 多載
public int Receive(byte[] buffer);
public int Receive(byte[] buffer, SocketFlags flags);
public int Receive(byte[] buffer, int size, SocketFlags flags);
public int Receive(byte[] buffer, int offset, int size, SocketFlags flags);
接收範例
byte[] buffer = new byte[1024];
int received = client.Receive(buffer, 0, buffer.Length, SocketFlags.None);
string msg = Encoding.UTF8.GetString(buffer, 0, received);
NetworkStream 接收
using (var stream = new NetworkStream(client)) {
byte[] buffer = new byte[1024];
int read = stream.Read(buffer, 0, buffer.Length); // 阻塞直到有資料或關閉
string msg = Encoding.UTF8.GetString(buffer, 0, read);
}
關鍵差異:Socket vs NetworkStream
| 特性 | Socket | NetworkStream |
| 抽象層級 | 傳輸層原始 | Stream 抽象 |
| 部分讀寫處理 | 手動迴圈 | 內建處理 |
| 非同步模式 | APM/BeginXxx | TAP/ReadAsync/WriteAsync |
| 編碼處理 | 手動 | 搭配 StreamReader/Writer |
| 適用場景 | 精細控制、UDP、Raw | TCP 應用層協定 |
進階:StreamReader/Writer 包裝
using (var stream = new NetworkStream(client))
using (var reader = new StreamReader(stream, Encoding.UTF8, detectEncodingFromByteOrderMarks: true, bufferSize: 1024, leaveOpen: false))
using (var writer = new StreamWriter(stream, Encoding.UTF8, 1024, leaveOpen: false)) {
writer.AutoFlush = true;
writer.WriteLine("Command");
string response = reader.ReadLine();
}
- 文字協定(HTTP、SMTP、自訂行制協定)首選
leaveOpen=false:Dispose 時關閉底層 Stream/Socket
效能提示
- 重用緩衝區:
ArrayPool.Shared.Rent/Return
- 大資料傳輸:
SendFile / FileStream.CopyTo 零拷貝
- 非同步:
SendAsync/ReceiveAsync + SocketAsyncEventArgs 避免分配