1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
| private void OnReceive(IAsyncResult result)
{
try
{
_logger.Info("Receiving data");
_socket.EndReceive(result);
_readBuffer.AddRange(_buffer);
int read = _readBuffer.Count;
while (read < SocketPacket.HeaderSize)
{
read+=_socket.Receive(_buffer, 0, _buffer.Length, SocketFlags.None);
_readBuffer.AddRange(_buffer);
}
Byte[] headerBuffer = new Byte[SocketPacket.HeaderSize];
_readBuffer.CopyTo(0, headerBuffer, 0, headerBuffer.Length);
_readBuffer.RemoveRange(0, headerBuffer.Length);
SocketPacket.SocketPacketHeader header = SerializerHelper.Deserialize(headerBuffer.ToArray());
read = _readBuffer.Count;
while (read < header.BufferSize)
{
read+=_socket.Receive(_buffer, 0, _buffer.Length, SocketFlags.None);
_readBuffer.AddRange(_buffer);
}
Byte[] contentBuffer = new Byte[header.BufferSize];
_readBuffer.CopyTo(0, contentBuffer, 0, contentBuffer.Length);
_readBuffer.RemoveRange(0, contentBuffer.Length);
RaiseEvent(OnDataReceived, new SocketDataEventArgs(contentBuffer));
_socket.BeginReceive(_buffer, 0, _buffer.Length, SocketFlags.None, OnReceive, null);
} catch (SocketException exception)
{
RaiseEvent(OnDisconnected, EventArgs.Empty);
_logger.Error(exception.Message, exception);
}
}
public void Send(object obj)
{
_logger.Info("Sending data");
SocketPacket packet = new SocketPacket(obj);
lock (writeLock)
{
Byte[] headerBuffer = SerializerHelper.Serialize(packet.GetHeader());
_socket.Send(headerBuffer, 0, headerBuffer.Length, SocketFlags.None);
_socket.Send(packet.Buffer, 0, packet.Buffer.Length, SocketFlags.None);
}
} |
Partager