1 // =================================
 2 // Copyright (c) 2024 Seppo Laakko
 3 // Distributed under the MIT license
 4 // =================================
 5 
 6 using System;
 7 using System.IO;
 8 
 9 namespace System.Net.Sockets
10 {
11     [nodiscard]
12     public Result<bool> SendString(TcpSocket& socketconst 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(plength);
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() + offsetbytesToReceive);
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     }