basesocketconnectionhost.cs
来自「ActiveSync数据同步」· CS 代码 · 共 1,663 行 · 第 1/4 页
CS
1,663 行
//----- Decrypt!
//rawBuffer = CryptUtils.DecryptData(connection, rawBuffer, FMessageBufferSize);
//----- Fire Event!
FireOnReceived(connection, rawBuffer, true);
}
readMessage = null;
callbackData = null;
if(!socketWasRead)
{
//----- Check Queue!
lock (connection.SyncReadCount)
{
connection.ReadCount--;
if (connection.ReadCount > 0)
{
//----- if it need more receiving, start the receive!
MessageBuffer continueReadMessage = new MessageBuffer(FSocketBufferSize);
//----- if the read queue has items, start to receive!
if (connection.Stream != null)
{
//----- Ssl!
connection.Stream.BeginRead(continueReadMessage.PacketBuffer, continueReadMessage.PacketOffSet, continueReadMessage.PacketRemaining, new AsyncCallback(BeginReadCallback), new CallbackData(connection, continueReadMessage));
}
else
{
//----- Socket!
connection.Socket.BeginReceive(continueReadMessage.PacketBuffer, continueReadMessage.PacketOffSet, continueReadMessage.PacketRemaining, SocketFlags.None, new AsyncCallback(BeginReadCallback), new CallbackData(connection, continueReadMessage));
}
}
}
}
}
#endregion
#region ReadMessageWithPacketHeader
private byte[] ReadMessageWithPacketHeader(byte[] connectionDelimiter, CallbackData callbackData, ref bool socketWasRead)
{
byte[] rawBuffer = null;
BaseSocketConnection connection = callbackData.Connection;
MessageBuffer readMessage = callbackData.Buffer;
//----- Message with delimiter!
int delimiterSize = connectionDelimiter.Length + 3;
bool readPacket = false;
bool readSocket = false;
do
{
rawBuffer = null;
if (readMessage.PacketOffSet > delimiterSize)
{
//----- Has Delimiter!
for (int i = 0; i < connectionDelimiter.Length; i++)
{
if (connectionDelimiter[i] != readMessage.PacketBuffer[i])
{
//----- Bad Delimiter!
throw new BadDelimiterException("Message delimiter is different from Host delimiter.");
}
}
//----- Get Length!
int messageLength = (readMessage.PacketBuffer[connectionDelimiter.Length] << 16)
+ (readMessage.PacketBuffer[connectionDelimiter.Length + 1] << 8)
+ (readMessage.PacketBuffer[connectionDelimiter.Length + 2]);
if (messageLength > FMessageBufferSize)
{
throw new MessageLengthException("Message length is greater than Host maximum message length.");
}
//----- Check Length!
if (messageLength == readMessage.PacketOffSet)
{
//----- Equal -> Get rawBuffer!
rawBuffer = readMessage.GetRawBuffer(messageLength, delimiterSize);
//----- Decrypt!
rawBuffer = CryptUtils.DecryptData(connection, rawBuffer, FMessageBufferSize);
readPacket = false;
readSocket = false;
}
else
{
if (messageLength < readMessage.PacketOffSet)
{
//----- Less -> Get rawBuffer and fire event!
rawBuffer = readMessage.GetRawBuffer(messageLength, delimiterSize);
//----- Decrypt!
rawBuffer = CryptUtils.DecryptData(connection, rawBuffer, FMessageBufferSize);
readPacket = true;
readSocket = false;
FireOnReceived(connection, rawBuffer, false);
}
else
{
if (messageLength > readMessage.PacketOffSet)
{
//----- Greater -> Read Socket!
if (messageLength > readMessage.PacketLength)
{
readMessage.Resize(messageLength);
}
readPacket = false;
readSocket = true;
}
}
}
}
else
{
if (readMessage.PacketRemaining < delimiterSize)
{
//----- Adjust room for more!
readMessage.Resize(readMessage.PacketLength + delimiterSize);
}
readPacket = false;
readSocket = true;
}
} while (readPacket);
if (readSocket)
{
if (connection.Active)
{
//----- Read More!
if (connection.Stream != null)
{
//----- Ssl!
connection.Stream.BeginRead(readMessage.PacketBuffer, readMessage.PacketOffSet, readMessage.PacketRemaining, new AsyncCallback(BeginReadCallback), callbackData);
}
else
{
//----- Socket!
connection.Socket.BeginReceive(readMessage.PacketBuffer, readMessage.PacketOffSet, readMessage.PacketRemaining, SocketFlags.None, new AsyncCallback(BeginReadCallback), callbackData);
}
}
}
socketWasRead = readSocket;
return rawBuffer;
}
#endregion
#region ReadMessageWithMessageTail
private byte[] ReadMessageWithMessageTail(byte[] connectionDelimiter, CallbackData callbackData, ref bool socketWasRead)
{
string stringDelimiter = Encoding.GetEncoding(1252).GetString(connectionDelimiter);
byte[] rawBuffer = null;
BaseSocketConnection connection = callbackData.Connection;
MessageBuffer readMessage = callbackData.Buffer;
//----- Message with delimiter!
int delimiterSize = connectionDelimiter.Length;
bool readPacket = false;
bool readSocket = false;
do
{
rawBuffer = null;
if (readMessage.PacketOffSet > delimiterSize)
{
int index = Encoding.GetEncoding(1252).GetString(readMessage.PacketBuffer).IndexOf(stringDelimiter);
if (index >= 0)
{
rawBuffer = readMessage.GetRawBufferWithTail(connection, index, delimiterSize);
//----- Decrypt!
rawBuffer = CryptUtils.DecryptData(connection, rawBuffer, FMessageBufferSize);
if (readMessage.PacketOffSet == 0)
{
readPacket = false;
readSocket = false;
}
else
{
readPacket = true;
readSocket = false;
FireOnReceived(connection, rawBuffer, false);
}
}
else
{
readPacket = false;
readSocket = true;
}
}
else
{
readPacket = false;
readSocket = (readMessage.PacketOffSet > 0);
}
} while (readPacket);
//----- Adjust room for more!
readMessage.Resize(FMessageBufferSize);
if (readSocket)
{
if (connection.Active)
{
//----- Read More!
if (connection.Stream != null)
{
//----- Ssl!
connection.Stream.BeginRead(readMessage.PacketBuffer, readMessage.PacketOffSet, readMessage.PacketRemaining, new AsyncCallback(BeginReadCallback), callbackData);
}
else
{
//----- Socket!
connection.Socket.BeginReceive(readMessage.PacketBuffer, readMessage.PacketOffSet, readMessage.PacketRemaining, SocketFlags.None, new AsyncCallback(BeginReadCallback), callbackData);
}
}
}
socketWasRead = readSocket;
return rawBuffer;
}
#endregion
#region BeginDisconnect
/// <summary>
/// Begin disconnect the connection
/// </summary>
internal void BeginDisconnect(BaseSocketConnection connection)
{
if (!Disposed)
{
ConnectionEventArgs e = new ConnectionEventArgs(connection);
if (connection.Active)
{
try
{
if ((Environment.OSVersion.Version.Major == 5)
&& (Environment.OSVersion.Version.Minor >= 1))
{
//----- NT5 / WinXP and later!
connection.Socket.BeginDisconnect(false, new AsyncCallback(BeginDisconnectCallback), e);
}
else
{
//----- NT5 / Win2000!
ThreadPool.QueueUserWorkItem(new WaitCallback(BeginDisconnectCallbackProcessing), e);
}
}
catch (Exception ex)
{
FireOnException(connection, ex);
}
}
else
{
RemoveSocketConnection(connection);
DisposeAndNullConnection(ref connection);
}
}
}
#endregion
#region BeginDisconnectCallback
/// <summary>
/// Disconnect callback.
/// </summary>
private void BeginDisconnectCallback(IAsyncResult ar)
{
if (!Disposed)
{
ThreadPool.QueueUserWorkItem(new WaitCallback(BeginDisconnectCallbackProcessing), ar);
}
}
#endregion
#region BeginDisconnectCallbackProcessing
private void BeginDisconnectCallbackProcessing(object state)
{
if (!Disposed)
{
bool calledByBeginDisconnect = false;
IAsyncResult ar = null;
BaseSocketConnection connection = null;
ConnectionEventArgs e = null;
try
{
if (state is ConnectionEventArgs)
{
//----- NT5 / Win2000!
e = (ConnectionEventArgs)state;
calledByBeginDisconnect = false;
}
else
{
//----- NT5 / WinXP and later!
ar = (IAsyncResult)state;
e = (ConnectionEventArgs)ar.AsyncState;
calledByBeginDisconnect = true;
}
connection = (BaseSocketConnection)e.Connection;
if (connection.Active)
{
if (calledByBeginDisconnect)
{
connection.Socket.EndDisconnect(ar);
}
lock (connection.SyncActive)
{
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?