3

以下の単純化されたコードのように、SendAsync() がバッファ内の意図したすべてのバイトの送信を完了したことを確認することは正しいことですか? それとも冗長ですか?これは TCP 接続ソケット用です。特に、ProcessSend() 内で SendAsync() への 2 番目のサブコールを発行する必要があることに関心があります。

たとえば、メッセージごとに新しい (プールされた) SocketAsyncEventArg を使用してクライアントにデータを送信する複数のスレッドがある場合、部分的に送信されたメッセージの間に同時送信が割り込む可能性はありませんか? それとも、データ送信で使用できる SocketAsyncEventArg を 1 つだけ許可して、クライアントへのアクセスを制御する正当な理由ですか?

private void ProcessSend(SocketAsyncEventArgs e)
{
    // Check that data was sent
    if ((e.SocketError == SocketError.Success) && (e.BytesTransferred > 0))
    {
        AsyncSendUserToken token = (AsyncSendUserToken)e.UserToken;

        // Check that all the data was sent
        int offset = e.Offset + e.BytesTransferred;
        if (offset < e.Count)
        {
            // Call send again to finish the send
            e.SetBuffer(offset, e.Count - offset);
            bool _willRaiseEvent = token.Socket.SendAsync(e);
            if (!_willRaiseEvent)
                ProcessSend(e);
        }
    }
}
4

2 に答える 2

1

あなたのコードに何か問題があると思います:

// Check that all the data was sent
int offset = e.Offset + e.BytesTransferred;
if (offset < e.Count)
{

e.Countは転送するバイト数であり、バイト配列へのオフセットではありません。

したがって、リンゴとリンゴを比較するには、次のように言います。

if(e.BytesTransfered <e.Count){}

于 2011-05-15T02:01:40.167 に答える