在網絡編程中經常需要發送/接受數據,故將經常運用到的方法放入到一個類庫中,方便在各個地方調用。
此類庫主要引用的命名空間是System及System.Net.Scokets。
下面呈上代碼:
/// <summary>
/// 接收變長的數據,要求其打頭的4個字節代表有效數據的長度
/// </summary>
/// <param name="s"></param>
/// <returns></returns>
public static byte[] ReceiveVarData(Socket s)
{
if (s == null)
throw new ArgumentNullException("s");
int total = 0; //已接收的字節數
int recv;
//接收4個字節,得到“消息長度”
byte[] datasize = new byte[4];
recv = s.Receive(datasize, 0, 4, 0);
int size = BitConverter.ToInt32(datasize, 0);
//按消息長度接收數據
int dataleft = size;
byte[] data = new byte[size];
while (total < size)
{
recv = s.Receive(data, total, dataleft, 0);
if (recv == 0)
{
break;
}
total += recv;
dataleft -= recv;
}
return data;
}
/// <summary>
/// 發送變長的數據,將數據長度附加于數據開頭
/// </summary>
/// <param name="s"></param>
/// <param name="data"></param>
/// <returns></returns>
public static int SendVarData(Socket s, byte[] data)
{
int total = 0;
int size = data.Length; //要發送的消息長度
int dataleft = size; //剩余的消息
int sent;
//將消息長度(int類型)的,轉為字節數組
byte[] datasize = BitConverter.GetBytes(size);
//將消息長度發送出去
sent = s.Send(datasize);
//發送消息剩余的部分
while (total < size)
{
sent = s.Send(data, total, dataleft, SocketFlags.None);
total += sent;
dataleft -= sent;
}
return total;
}