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;

        } 

如果是udp的话 包的顺序应该不定吧 这个时候需要依靠协议了

posted on 2011-07-08 21:20  ThinkInSharp  阅读(2540)  评论(0编辑  收藏  举报

导航