7

私はSocketAsyncEventArgsでSetBufferをうまく使うことができます。

(SetBuffer(null、0、0)を実行した後)BufferListを使用しようとすると、ソケットでSendAsyncを実行すると、常にすぐにSocketError InvalidArgument(10022)が発生します。

BufferListの使用方法に関する例やドキュメントはなく、私が行っていることは(とにかく私には)理にかなっています。

誰かがサンプルプログラムやコードスニペットを指摘できますか?

私はこれで髪を引き裂いていて、あまり残っていません...

これが基本的に私が行っていることです(eは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);
}
4

1 に答える 1

12

例外が発生する理由は、内部では、プロパティSocketAsyncEventArgsの設定時にリストに存在するバッファーのみが使用されるためです。BufferList基本的に、コードで空のバッファを送信しようとしています:

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;

この動作は十分に文書化されておらず、BufferListsetter コードを詳細に調べることによってのみ理解できます。舞台裏で にSocketAsyncEventArgsWSABuffer配列フィールド (ネイティブ コードとの相互運用用) があり、BufferList. ネイティブ コードに送信されるのはこれWSABuffer[]であるため、コードが例外をスローする理由が説明されます。

于 2013-07-02T09:44:04.920 に答える