2012-08-05 2 views
7

SetBuffer를 SocketAsyncEventArgs와 함께 사용할 수 있습니다.어떻게 BufferList를 SocketAsyncEventArgs와 함께 사용하고 SocketError InvalidArgument를 가져 오지 않습니까?

SetBuffer (null, 0, 0)을 수행 한 후 BufferList를 사용하려고하면 소켓에서 SendAsync를 수행 할 때 항상 SocketError InvalidArgument (10022)가 발생합니다.

BufferList를 사용하는 방법에 대한 예제 나 문서가 없으며 내가하고있는 일이 (어쨌든 나에게) 의미가 있습니다.

예제 프로그램이나 코드 조각을 지적 할 수 있습니까?

나는이 이상 내 머리를 찢어있어 훨씬 여기

내가 전자가 SocketAsyncEventArgs입니다 (뭘 오전 기본적으로 ... 왼쪽하지 않고 lSocket 작동 내가 SetBuffer 사용하는 것과 동일한 소켓입니다)

// 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

사용하는 언어로 태그를 지정하면 질문에 대한 답변을 얻을 확률이 높아집니다. –

+0

모든 ArraySegments가 동일한 물리적 바이트 배열에 속해야합니까? 그렇다면 BufferList를 쓸모 없게 만듭니다. 누구든지 BufferList를 성공적으로 사용 했습니까? – Dave

+0

누구나 여기에 아이디어가 있습니까? – Dave

답변

9

당신이 예외를 얻고있는 이유는 후드 아래에 SocketAsyncEventArgsBufferList 속성을 설정시 목록에 버퍼를 사용한다는 것입니다. 수행하려고 대신

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))); 

: 기본적으로 당신은 코드와 함께 빈 버퍼 엉 보내려고

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; 

이 동작이 잘 전혀 문서화되지 않습니다 만 보면 이해 될 수있다 BufferList 세터 코드 상세. 배후에서 SocketAsyncEventArgsBufferList을 설정할 때 바이트 배열 참조를 복사하고 고정하는 WSABuffer 배열 필드 (네이티브 코드와의 interop 용)가 있습니다. 네이티브 코드로 전송되는 코드는 WSABuffer[]이므로 코드에서 예외가 발생하는 이유를 설명합니다.

+0

감사합니다. 의미가 있지만 분명하지는 않습니다 ... – Dave

+1

확실히 아닙니다, 나는 당신의 게시물을 발견하고 아무도 대답하지 않은 것에 대해 매우 실망했습니다. MS는 실제로 이것을 더 잘 문서화해야합니다. 너무 나쁜 나는 당신에게 늦게 대답하는 1 년이다). – JJ15k

관련 문제