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

C# Socket Send/Receive 多載詳解與 NetworkStream 封裝應用

     編輯:關於C語言

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

特性SocketNetworkStream
抽象層級傳輸層原始Stream 抽象
部分讀寫處理手動迴圈內建處理
非同步模式APM/BeginXxxTAP/ReadAsync/WriteAsync
編碼處理手動搭配 StreamReader/Writer
適用場景精細控制、UDP、RawTCP 應用層協定

進階: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 避免分配
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved