@@ -14,7 +14,6 @@ internal class Messager : IDisposable
1414 public event EventHandler < ExceptionEventArgs > MessagerException ;
1515
1616 private readonly UdpSocket _socket ;
17- private readonly object _disposeLock = new object ( ) ;
1817 private bool _disposed ;
1918
2019#if UNITY_EDITOR_WIN
@@ -54,13 +53,13 @@ private void BeginReceiveMessage()
5453
5554 try
5655 {
57- lock ( _disposeLock )
58- {
59- if ( _disposed )
60- return ;
56+ beginReceive :
57+ if ( _disposed )
58+ return ;
6159
62- _socket . BeginReceiveFrom ( buffer , 0 , buffer . Length , SocketFlags . None , ref any , ReceiveMessageCallback , buffer ) ;
63- }
60+ var result = _socket . BeginReceiveFrom ( buffer , 0 , buffer . Length , SocketFlags . None , ref any , ReceiveMessageCallback , buffer ) ;
61+ if ( result . CompletedSynchronously )
62+ goto beginReceive ;
6463 }
6564 catch ( SocketException se )
6665 {
@@ -79,13 +78,10 @@ private void ReceiveMessageCallback(IAsyncResult result)
7978 {
8079 var endPoint = UdpSocket . Any ( ) ;
8180
82- lock ( _disposeLock )
83- {
84- if ( _disposed )
85- return ;
81+ if ( _disposed )
82+ return ;
8683
87- _socket . EndReceiveFrom ( result , ref endPoint ) ;
88- }
84+ _socket . EndReceiveFrom ( result , ref endPoint ) ;
8985
9086 var message = DeserializeMessage ( UdpSocket . BufferFor ( result ) ) ;
9187 if ( message != null )
@@ -117,7 +113,8 @@ private void ReceiveMessageCallback(IAsyncResult result)
117113 RaiseMessagerException ( e ) ;
118114 }
119115
120- BeginReceiveMessage ( ) ;
116+ if ( ! result . CompletedSynchronously )
117+ BeginReceiveMessage ( ) ;
121118 }
122119
123120 private static bool IsValidTcpMessage ( Message message , out int port , out int bufferSize )
@@ -153,43 +150,40 @@ public void SendMessage(IPEndPoint target, MessageType type, string value = "")
153150
154151 try
155152 {
156- lock ( _disposeLock )
157- {
158- if ( _disposed )
159- return ;
153+ if ( _disposed )
154+ return ;
160155
161- if ( buffer . Length >= UdpSocket . BufferSize )
156+ if ( buffer . Length >= UdpSocket . BufferSize )
157+ {
158+ // switch to TCP mode to handle big messages
159+ var port = TcpListener . Queue ( buffer ) ;
160+ if ( port > 0 )
162161 {
163- // switch to TCP mode to handle big messages
164- var port = TcpListener . Queue ( buffer ) ;
165- if ( port > 0 )
166- {
167- // success, replace original message with "switch to tcp" marker + port information + buffer length
168- message = MessageFor ( MessageType . Tcp , string . Concat ( port , ':' , buffer . Length ) ) ;
169- buffer = SerializeMessage ( message ) ;
170- }
162+ // success, replace original message with "switch to tcp" marker + port information + buffer length
163+ message = MessageFor ( MessageType . Tcp , string . Concat ( port , ':' , buffer . Length ) ) ;
164+ buffer = SerializeMessage ( message ) ;
171165 }
172-
173- _socket . BeginSendTo ( buffer , 0 , Math . Min ( buffer . Length , UdpSocket . BufferSize ) , SocketFlags . None , target , SendMessageCallback , null ) ;
174166 }
167+
168+ _socket . BeginSendTo ( buffer , 0 , Math . Min ( buffer . Length , UdpSocket . BufferSize ) , SocketFlags . None , target , SendMessageCallback , null ) ;
175169 }
176170 catch ( SocketException se )
177171 {
178172 MessagerException ? . Invoke ( this , new ExceptionEventArgs ( se ) ) ;
179173 }
174+ catch ( ObjectDisposedException )
175+ {
176+ }
180177 }
181178
182179 private void SendMessageCallback ( IAsyncResult result )
183180 {
184181 try
185182 {
186- lock ( _disposeLock )
187- {
188- if ( _disposed )
189- return ;
183+ if ( _disposed )
184+ return ;
190185
191- _socket . EndSendTo ( result ) ;
192- }
186+ _socket . EndSendTo ( result ) ;
193187 }
194188 catch ( SocketException se )
195189 {
@@ -228,11 +222,14 @@ public static Messager BindTo(int port)
228222
229223 public void Dispose ( )
230224 {
231- lock ( _disposeLock )
225+ try
232226 {
233227 _disposed = true ;
234228 _socket . Close ( ) ;
235229 }
230+ catch
231+ {
232+ }
236233 }
237234 }
238235}
0 commit comments