Skip to content

Commit 7d7e0e3

Browse files
release v1.0.6
- [opt] delay memory allocation to prevent allocation when connection is failed
1 parent 53661b8 commit 7d7e0e3

2 files changed

Lines changed: 31 additions & 25 deletions

File tree

Miku.Core/NetClient.cs

Lines changed: 29 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -53,29 +53,11 @@ public class NetClient
5353
private bool _isConnected;
5454
private int _sending;
5555

56-
private readonly SocketAsyncEventArgs _receiveArg;
57-
private readonly SocketAsyncEventArgs _sendArg;
58-
private readonly ArrayBufferWriter<byte> _receivedData;
56+
private SocketAsyncEventArgs _receiveArg;
57+
private SocketAsyncEventArgs _sendArg;
58+
private ArrayBufferWriter<byte> _receivedData;
5959
private byte[] _tempSendBuffer;
6060

61-
/// <summary>
62-
/// Create a new instance of NetClient
63-
/// </summary>
64-
/// <param name="bufferSize"></param>
65-
public NetClient(int bufferSize = 1024)
66-
{
67-
_receivedData = new ArrayBufferWriter<byte>(bufferSize);
68-
69-
_receiveArg = new SocketAsyncEventArgs();
70-
_receiveArg.SetBuffer(new byte[bufferSize], 0, bufferSize);
71-
_receiveArg.UserToken = this;
72-
_receiveArg.Completed += HandleReadWrite;
73-
74-
_sendArg = new SocketAsyncEventArgs();
75-
_sendArg.UserToken = this;
76-
_sendArg.Completed += HandleReadWrite;
77-
}
78-
7961
/// <summary>
8062
/// Add a middleware to the client
8163
/// </summary>
@@ -99,8 +81,9 @@ public void RemoveMiddleware(INetMiddleware middleware)
9981
/// </summary>
10082
/// <param name="ip"></param>
10183
/// <param name="port"></param>
84+
/// <param name="bufferSize"></param>
10285
/// <exception cref="InvalidOperationException"></exception>
103-
public void Connect(string ip, int port)
86+
public void Connect(string ip, int port, int bufferSize = 1024)
10487
{
10588
if (_isConnected)
10689
{
@@ -112,6 +95,17 @@ public void Connect(string ip, int port)
11295
_isConnected = true;
11396
Ip = ((System.Net.IPEndPoint)_socket.RemoteEndPoint!).Address.ToString();
11497

98+
_receivedData = new ArrayBufferWriter<byte>(bufferSize);
99+
100+
_receiveArg = new SocketAsyncEventArgs();
101+
_receiveArg.SetBuffer(new byte[bufferSize], 0, bufferSize);
102+
_receiveArg.UserToken = this;
103+
_receiveArg.Completed += HandleReadWrite;
104+
105+
_sendArg = new SocketAsyncEventArgs();
106+
_sendArg.UserToken = this;
107+
_sendArg.Completed += HandleReadWrite;
108+
115109
OnConnected?.Invoke();
116110

117111
if (!_socket.ReceiveAsync(_receiveArg))
@@ -124,8 +118,9 @@ public void Connect(string ip, int port)
124118
/// When a server accepts a connection, use this method to connect the client
125119
/// </summary>
126120
/// <param name="socket"></param>
121+
/// <param name="bufferSize"></param>
127122
/// <exception cref="InvalidOperationException"></exception>
128-
internal void Connect(Socket socket)
123+
internal void Connect(Socket socket, int bufferSize = 1024)
129124
{
130125
if (_isConnected)
131126
{
@@ -135,6 +130,17 @@ internal void Connect(Socket socket)
135130
_socket = socket;
136131
_isConnected = true;
137132
Ip = ((System.Net.IPEndPoint)socket.RemoteEndPoint!).Address.ToString();
133+
134+
_receivedData = new ArrayBufferWriter<byte>(bufferSize);
135+
136+
_receiveArg = new SocketAsyncEventArgs();
137+
_receiveArg.SetBuffer(new byte[bufferSize], 0, bufferSize);
138+
_receiveArg.UserToken = this;
139+
_receiveArg.Completed += HandleReadWrite;
140+
141+
_sendArg = new SocketAsyncEventArgs();
142+
_sendArg.UserToken = this;
143+
_sendArg.Completed += HandleReadWrite;
138144

139145
OnConnected?.Invoke();
140146

Miku.Core/NetServer.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@ private void ProcessAccept(object sender, SocketAsyncEventArgs e)
126126
Socket acceptedSocket = e.AcceptSocket;
127127

128128
// Create a new NetClient using the accepted socket.
129-
NetClient client = new NetClient(BufferSize);
129+
NetClient client = new NetClient();
130130
lock (_clients)
131131
{
132132
_clients.Add(client);
@@ -143,7 +143,7 @@ private void ProcessAccept(object sender, SocketAsyncEventArgs e)
143143
};
144144
client.OnDataReceived += data => OnClientDataReceived?.Invoke(client, data);
145145
client.OnError += OnError;
146-
client.Connect(acceptedSocket);
146+
client.Connect(acceptedSocket, BufferSize);
147147
}
148148
// If the accept operation was canceled, then the server is stopped.
149149
else if (e.SocketError != SocketError.Interrupted && e.SocketError != SocketError.OperationAborted)

0 commit comments

Comments
 (0)