SocketAsyncEventArgs的BufferList参数
这个类有一个属性BufferList MSDN上没有示例 网上介绍这个属性的文章基本没有
经过我自己的摸索总算明白这个属性有什么用了
主要应用场景就是在你发送的数据大于buffer大小的时候可以把多个Byte[]数组放进bufferlist里面 然后一句代码发送
tcp的话按照顺序 也不会出错 主要代码如下:
private void Send_Click(object sender, RoutedEventArgs e)
{
byte[] sendMessage = System.Text.Encoding.UTF8.GetBytes(tbxSendContent.Text);
IList<ArraySegment<byte>> asm = ConvertFrom<byte>(sendMessage, 4);
SocketAsyncEventArgs sea = new SocketAsyncEventArgs();
sea.BufferList = asm;
sea.Completed += new EventHandler<SocketAsyncEventArgs>(IO_Completed);
bool w = clientSocket.SendAsync(sea);
if (!w) {
processSend(sea);
}
}
private void processSend(SocketAsyncEventArgs e)
{
if (e.SocketError == SocketError.Success)
{
//MessageBox.Show("yes");
}
else
{
MessageBox.Show(e.SocketError.ToString());
}
}
void IO_Completed(object sender, SocketAsyncEventArgs e)
{
switch (e.LastOperation)
{
case SocketAsyncOperation.Accept:
break;
case SocketAsyncOperation.Connect:
break;
case SocketAsyncOperation.Disconnect:
//closeClientSocket(e);
break;
case SocketAsyncOperation.None:
break;
case SocketAsyncOperation.Receive:
//processReceive(e);
break;
case SocketAsyncOperation.ReceiveFrom:
break;
case SocketAsyncOperation.ReceiveMessageFrom:
break;
case SocketAsyncOperation.Send:
processSend(e);
break;
case SocketAsyncOperation.SendPackets:
break;
case SocketAsyncOperation.SendTo:
break;
default:
throw new ArgumentException("Socket上最后的操作不是receive(接收)也不是send(发送)。");
break;
}
}
public IList<ArraySegment<T>> ConvertFrom<T>(T[] source, int size) {
IList<ArraySegment<T>> target = new List<ArraySegment<T>>();
int l = source.Length / size;
int y = source.Length % size;
for (int i = 0; i < l; i++)
{
target.Add(new ArraySegment<T>(source, i*size, size));
}
if(y!=0)
target.Add(new ArraySegment<T>(source, l*size, y));
return target;
{
byte[] sendMessage = System.Text.Encoding.UTF8.GetBytes(tbxSendContent.Text);
IList<ArraySegment<byte>> asm = ConvertFrom<byte>(sendMessage, 4);
SocketAsyncEventArgs sea = new SocketAsyncEventArgs();
sea.BufferList = asm;
sea.Completed += new EventHandler<SocketAsyncEventArgs>(IO_Completed);
bool w = clientSocket.SendAsync(sea);
if (!w) {
processSend(sea);
}
}
private void processSend(SocketAsyncEventArgs e)
{
if (e.SocketError == SocketError.Success)
{
//MessageBox.Show("yes");
}
else
{
MessageBox.Show(e.SocketError.ToString());
}
}
void IO_Completed(object sender, SocketAsyncEventArgs e)
{
switch (e.LastOperation)
{
case SocketAsyncOperation.Accept:
break;
case SocketAsyncOperation.Connect:
break;
case SocketAsyncOperation.Disconnect:
//closeClientSocket(e);
break;
case SocketAsyncOperation.None:
break;
case SocketAsyncOperation.Receive:
//processReceive(e);
break;
case SocketAsyncOperation.ReceiveFrom:
break;
case SocketAsyncOperation.ReceiveMessageFrom:
break;
case SocketAsyncOperation.Send:
processSend(e);
break;
case SocketAsyncOperation.SendPackets:
break;
case SocketAsyncOperation.SendTo:
break;
default:
throw new ArgumentException("Socket上最后的操作不是receive(接收)也不是send(发送)。");
break;
}
}
public IList<ArraySegment<T>> ConvertFrom<T>(T[] source, int size) {
IList<ArraySegment<T>> target = new List<ArraySegment<T>>();
int l = source.Length / size;
int y = source.Length % size;
for (int i = 0; i < l; i++)
{
target.Add(new ArraySegment<T>(source, i*size, size));
}
if(y!=0)
target.Add(new ArraySegment<T>(source, l*size, y));
return target;
}
如果是udp的话 包的顺序应该不定吧 这个时候需要依靠协议了posted on 2011-07-08 21:20 ThinkInSharp 阅读(2540) 评论(0) 编辑 收藏 举报