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