Ist es richtig, wie im unten stehenden vereinfachten Code zu prüfen, ob SendAsync() die Übertragung aller vorgesehenen Bytes im Puffer abgeschlossen hat? Oder ist das überflüssig? Dies ist für einen TCP-Verbindungssocket. Ich bin besonders besorgt darüber, einen zweiten Unteraufruf von SendAsync() innerhalb von ProcessSend() ausführen zu müssen.
Wenn ich z. B. mehrere Threads habe, die Daten an einen Client übertragen und dabei für jede Nachricht ein neues (gepooltes) SocketAsyncEventArg verwenden, ist es dann nicht möglich, dass sich ein gleichzeitiges Senden zwischen eine teilweise übertragene Nachricht schiebt? Oder ist dies ein guter Grund für einen kontrollierten Zugriff auf den Client, indem nur ein SocketAsyncEventArg für die Datenübertragung verwendet werden darf?
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);
}
}
}
0 Stimmen
Ich habe auch gesehen, dass dies passiert, und ich habe auch Fälle gesehen, in denen die Anzahl der übertragenen Bytes größer war als e.Count - e.Offset. Ich habe das eine SocketAsyncEventArgs für das Senden wiederverwendet und eine Methode aufgerufen, die den Puffer füllt und SendAsync von ProcessSend aufruft. Ich fügte Code hinzu, um die aktuelle SocketAsynEventArgs in ProcessSend zu entsorgen und eine neue zu erstellen, und dies hat diesen Fehler gestoppt.