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 }