internal void Send(OutgoingMessage message) { var connection = message.MonoConnection; if (connection.Sending) { //TODO: Error } else { lock (connection) { connection.Sending = true; } } if (message.SendDataBuffer == null) { message.SendDataBuffer = message.BufferHandle; } try { connection.Socket.BeginSend( message.SendDataBuffer, message.SendDataOffset, message.SendDataBytesRemaining, System.Net.Sockets.SocketFlags.None, SendDone, message ); } catch (SocketException) { Disconnect(connection); if (!OutgoingMessagePool.TryPush(message)) { //TODO: Error } } catch (NullReferenceException) { // This means that socket was null (connection was already closed) // We can just ignore this } }
void SendDone(IAsyncResult result) { var message = (OutgoingMessage)result.AsyncState; var connection = message.MonoConnection; try { var bytesTransferred = connection.Socket.EndSend(result); message.SendDataBytesRemaining -= bytesTransferred; message.SendDataBytesSent += bytesTransferred; if (message.SendDataBytesRemaining > 0) { Send(message); } else { if (!OutgoingMessagePool.TryPush(message)) { //TODO: Error } lock (connection) { if (connection.SendQueue.Count > 0) { Send(connection.SendQueue.Dequeue()); } else { connection.Sending = false; } } } } catch (SocketException) { Disconnect(connection); if (!OutgoingMessagePool.TryPush(message)) { //TODO: Error } } }
void OnSendComplete(OutgoingMessage message) { if (message.AsyncArgs.SocketError != SocketError.Success) { return; } message.SendDataBytesRemaining -= message.AsyncArgs.BytesTransferred; message.SendDataBytesSent += message.AsyncArgs.BytesTransferred; if (message.SendDataBytesRemaining > 0) { Send(message); } else { var connection = message.Win32Connection; if (OutgoingMessagePool.TryPush(message)) { //TODO: Error } lock (connection) { if (connection.SendQueue.Count > 0) { Send(connection.SendQueue.Dequeue()); } else { connection.Sending = false; } } } }