2012-08-05 7 views
7

SetBuffer'ı SocketAsyncEventArgs ile birlikte kullanabilirim.SocketAsyncEventArgs ile BufferList nasıl kullanılır ve SocketError InvalidArgument'i alamıyorsunuz?

BufferList'i kullanmaya çalışırsam (SetBuffer'ı (null, 0, 0) yaptıktan sonra) her zaman ve hemen Soket üzerine SendAsync yaptığımda hemen SocketError InvalidArgument (10022) alırım.

BufferList'in nasıl kullanıldığına ve ne yaptığımın mantıklı olduğuna dair bir örnek veya belge yok (yine de bana).

Birisi örnek bir program veya kod pasajına işaret edebilir mi?

Ben bu aşkın olsam deliye ediyorum ve çok Burada

Ben e SocketAsyncEventArgs olduğunu (ne yapıyorum temelde ... bırakmış yoktur ve lSocket işleri ben setbuffer için kullanmak sokettir)

// null the buffer since we will use a buffer list 
e.SetBuffer(null, 0, 0); 

// create a bufferlist 
e.BufferList = new List<ArraySegment<byte>>(); 

// create the bufferlist with the network header and the response bytes 
e.BufferList.Add(new ArraySegment<byte>(lTxBytes)); // add the 4 character total length 
e.BufferList.Add(new ArraySegment<byte>(Encoding.ASCII.GetBytes(lTx.Identity))); // echo back the incoming sequence number 
e.BufferList.Add(new ArraySegment<byte>(Encoding.ASCII.GetBytes(lResponse))); 

// *** the SendAsync always completes IMMEDIATELY (returns false) gets SocketError InvalidArgument (10022) 

if (lSocket.SendAsync(e) == false) 
{ 
     // data was already sent back to the client. 
     AppSupport.WriteLog(LogLevel.Flow, "ProcessReceive had SendAsync complete synchronously (bytes transferred {0}).", e.BytesTransferred); 
     ProcessSend(e); 
} 
+0

Kullandığınız dil ile etiketliyorsanız, sorunuza yanıt almak için daha iyi bir şansa sahipsiniz. –

+0

Tüm ArraySegments'ın aynı fiziksel bayt dizisinin bir parçası olması gerekiyor mu? Eğer durum buysa, BufferList'i işe yaramaz hale getirecektir. BufferList'i başarıyla kullanan var mı? – Dave

+0

Burada herhangi bir fikri olan var mı? – Dave

cevap

9

bir istisna alıyorsanız nedeni başlık altında SocketAsyncEventArgs sadece BufferList özelliğini ayarlayarak sırasında listede bulunan tampon kullanır. yapmaya çalışacağım yerine

e.BufferList = new List<ArraySegment<byte>>(); 
e.BufferList.Add(new ArraySegment<byte>(lTxBytes)); 
e.BufferList.Add(new ArraySegment<byte>(Encoding.ASCII.GetBytes(lTx.Identity))); 
e.BufferList.Add(new ArraySegment<byte>(Encoding.ASCII.GetBytes(lResponse))); 

: Temelde kodu ile boş tampon tr göndermeye çalıştığınız

var list = new List<ArraySegment<byte>>(); 
list.Add(new ArraySegment<byte>(lTxBytes)); 
list.Add(new ArraySegment<byte>(Encoding.ASCII.GetBytes(lTx.Identity))); 
list.Add(new ArraySegment<byte>(Encoding.ASCII.GetBytes(lResponse))); 
e.BufferList = list; 

Bu davranış değil de tüm belgelenmiş değildir ve sadece bakarak anlaşılabilir BufferList ayar kodu ayrıntılı. Sahne arkasında SocketAsyncEventArgsWSABuffer dizi alanına (yerel kodla birlikte çalışır) sahiptir ve burada BufferList'u ayarladığınızda bayt dizileri başvuruları kopyalar ve işaretler. Yerel koda gönderilen bu WSABuffer[] olduğundan, kodunuzun neden bir istisna oluşturduğunu açıklar.

+0

Teşekkürler. Mantıklı ve mantıklı değil ... – Dave

+1

Kesinlikle, ben senin yazı bulundu ve ben kimse cevap vermişti çok hayal kırıklığına uğradığında aynı sorunla karşılaşıyordu. MS bunu daha iyi belgelemeli. Çok kötüyüm, sana cevap vermek için bir yıl geciktim;). – JJ15k

İlgili konular