1 
  
   2 
  
   3 
  
   4 
  
   5 
  
   6 using System;
  
   7 using System.IO;
  
   8 
  
   9 namespace System.Net.Sockets
  
  10 {
  
  11     [nodiscard]
  
  12     public Result<bool> SendString(TcpSocket& socket, const string& s)
  
  13     {
  
  14         int length = cast<int>(s.Length());
  
  15         byte[4] lengthBuffer;
  
  16         MemoryWriter writer(&lengthBuffer[0], 4);
  
  17         Result<bool> result = writer.Write(length);
  
  18         if (result.Error()) return result;
  
  19         result = socket.SendAll(&lengthBuffer[0], 4);
  
  20         if (result.Error()) return result;
  
  21         byte* p = cast<byte*>(cast<void*>(s.Chars()));
  
  22         result = socket.SendAll(p, length);
  
  23         if (result.Error()) return result;
  
  24         return Result<bool>(true);
  
  25     }
  
  26 
  
  27     [nodiscard]
  
  28     public Result<string> ReceiveString(TcpSocket& socket)
  
  29     {
  
  30         byte[4] lengthBuffer;
  
  31         int bytesToReceive = 4;
  
  32         int offset = 0;
  
  33         while (bytesToReceive > 0)
  
  34         {
  
  35             Result<int> bytesReceivedResult = socket.Receive(&lengthBuffer[offset], bytesToReceive);
  
  36             if (bytesReceivedResult.Error())
  
  37             {
  
  38                 return Result<string>(ErrorId(bytesReceivedResult.GetErrorId()));
  
  39             }
  
  40             int bytesReceived = bytesReceivedResult.Value();
  
  41             bytesToReceive = bytesToReceive - bytesReceived;
  
  42             offset = offset + bytesReceived;
  
  43         }
  
  44         MemoryReader reader(&lengthBuffer[0], 4);
  
  45         Result<int> lengthResult = reader.ReadInt();
  
  46         if (lengthResult.Error())
  
  47         {
  
  48             return Result<string>(ErrorId(lengthResult.GetErrorId()));
  
  49         }
  
  50         int length = lengthResult.Value();
  
  51         if (length == 0)
  
  52         {
  
  53             return Result<string>(string());
  
  54         }
  
  55         UniquePtr<byte> mem(cast<byte*>(MemAlloc(length)));
  
  56         offset = 0;
  
  57         bytesToReceive = length;
  
  58         while (bytesToReceive > 0)
  
  59         {
  
  60             Result<int> bytesReceivedResult = socket.Receive(mem.Get() + offset, bytesToReceive);
  
  61             if (bytesReceivedResult.Error())
  
  62             {
  
  63                 return Result<string>(ErrorId(bytesReceivedResult.GetErrorId()));
  
  64             }
  
  65             int bytesReceived = bytesReceivedResult.Value();
  
  66             bytesToReceive = bytesToReceive - bytesReceived;
  
  67             offset = offset + bytesReceived;
  
  68         }
  
  69         string s(cast<const char*>(cast<void*>(mem.Get())), length);
  
  70         return Result<string>(s);
  
  71     }