Frage

Wie im folgenden vereinfachten Code ist die Überprüfung, dass SendaSync () alle beabsichtigten Bytes im Puffer über die richtige Sache übertragen hat? Oder ist das überflüssig? Dies gilt für einen TCP -Verbindungsbuchsen. Ich bin besonders besorgt darüber, dass ich einen zweiten Unterangang an SendaSync () in Inside Processsend () ausstellen muss.

Wenn ich beispielsweise mehrere Threads über eine neue (gepoolte) SocketasynceEventarg für jede Nachricht an einen Client überträgt, ist es dann nicht möglich, dass sich ein gleichzeitiger Send zwischen einer teilweise übertragenen Nachricht befasst? Oder ist dies ein guter Grund für den kontrollierten Zugriff auf den Client, indem nur ein SocketasynceEventarg für das Senden von Daten verwendet werden kann?

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);
        }
    }
}
War es hilfreich?

Lösung

Ich vermute, Sie lesen das Beispiel bei http://msdn.microsoft.com/en-us/library/system.net.sockets.socketasynceventargs.aspx und sehen Sie, dass sie die Byte -Länge von Processreceive überprüfen.

Dies geschieht, um alle empfangenen Bytes zu erhalten, da Sie keine Kontrolle darüber haben, wie viele Bytes jedes Mal von der anderen Partei gesendet werden.

Wenn Sie einen Senden ausführen, ist dies überflüssig, da das Framework alle Ihre Daten für Sie senden.

Andere Tipps

Ich denke, in Ihrem Code stimmt etwas nicht:

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

E.Count ist die Anzahl der Bytes, die übertragen werden sollen, es ist kein Versatz in das Byte -Array.

Um Äpfel mit Äpfeln zu vergleichen, würden Sie sagen:

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top