public void SendData(object dataToSend, bool dontWait = false) { var data = DataConverter.SerializeData(dataToSend); //Add size to vegin of the array var dataSize = (short)data.Length; DataConverter.FromInt(dataSize, out var byte1, out var byte2, out var byte3, out var byte4); // Add data size to the beginning data = DataConverter.MergeByteArrays(new byte[] { byte1, byte2, byte3, byte4 }, data); try { if (!dontWait) { //Begin sending file ClientReceiveDone.WaitOne(7000); ClientReceiveDone.Reset(); } HandledSocket.BeginSend(data, 0, data.Length, 0, new AsyncCallback(SendCallback), null); } catch (Exception e) { Console.WriteLine(e.Message); Disconnect(); } }
public void ReceiveData() { try { HandledSocket.BeginReceive(Buffer, 0, BufferSize, 0, new AsyncCallback(ReceiveCallback), null); } catch (Exception e) { Console.WriteLine(e.Message); Disconnect(); } }
public void Disconnect() { HandledSocket.Close(); HandledSocket.Dispose(); ClientDisconnected?.Invoke(this); //Set user status to offline if (UserInfo != null) { HandleCommand(new Command(CommandType.SignOut, null, UserInfo)); } }
void SendCallback(IAsyncResult ar) { try { //Complate sending data int bytesSent = HandledSocket.EndSend(ar); } catch (Exception e) { Console.WriteLine(e.Message); Disconnect(); } }
void ReceiveCallback(IAsyncResult ar) { int bytesRead; // If user disconects than we will catch that try { //Read data from the client socket bytesRead = HandledSocket.EndReceive(ar); } catch (Exception e) { Console.WriteLine(e.Message); Disconnect(); return; } if (bytesRead > 0) { //Check lable and resume sending if (Encoding.Default.GetString(Buffer).Contains("<EndOfReceiving>")) { ClientReceiveDone.Set(); ReceiveData(); return; } //If it's first portion of data if (BinReceivedData.Count == 0) { //get data size dataSize = DataConverter.ToInt(Buffer[0], Buffer[1], Buffer[2], Buffer[3]) + 4; } //Delete size of received data dataSize -= Buffer.Length; if (dataSize <= 0) { //Separate data from dummy bytes byte[] temp = new byte[dataSize + Buffer.Length]; Array.Copy(Buffer, 0, temp, 0, dataSize + Buffer.Length); //Copy buffer to bin recieved data BinReceivedData.AddRange(temp); //Remove first 2 bytes(size of data) BinReceivedData.RemoveRange(0, 4); //Send signal to resume receiving SendData("<EndOfReceiving>", true); HandleCommand(); ReceiveData(); } else { //Copy buffer to bin recieved data BinReceivedData.AddRange(Buffer); ReceiveData(); } } }