@@ -101,7 +101,6 @@ public void NotConnected_ThrowsException()
101101 public void SendFile_Synchronous ( IPAddress listenAt , bool sendPreAndPostBuffers , int bytesToSend )
102102 {
103103 const int ListenBacklog = 1 ;
104- const int LingerTime = 10 ;
105104 const int TestTimeout = 30000 ;
106105
107106 // Create file to send
@@ -152,8 +151,7 @@ public void SendFile_Synchronous(IPAddress listenAt, bool sendPreAndPostBuffers,
152151 using ( client )
153152 {
154153 client . SendFile ( filename , preBuffer , postBuffer , TransmitFileOptions . UseDefaultWorkerThread ) ;
155-
156- client . LingerState = new LingerOption ( true , LingerTime ) ;
154+ client . Shutdown ( SocketShutdown . Send ) ;
157155 }
158156
159157 Assert . True ( serverThread . Join ( TestTimeout ) , "Completed within allowed time" ) ;
@@ -170,86 +168,58 @@ public void SendFile_Synchronous(IPAddress listenAt, bool sendPreAndPostBuffers,
170168 [ MemberData ( nameof ( SendFile_MemberData ) ) ]
171169 public void SendFile_APM ( IPAddress listenAt , bool sendPreAndPostBuffers , int bytesToSend )
172170 {
173- const int ListenBacklog = 1 ;
174- const int LingerTime = 10 ;
175- const int TestTimeout = 30000 ;
171+ const int ListenBacklog = 1 , TestTimeout = 30000 ;
176172
177173 // Create file to send
178- byte [ ] preBuffer ;
179- byte [ ] postBuffer ;
174+ byte [ ] preBuffer , postBuffer ;
180175 Fletcher32 sentChecksum ;
181176 string filename = CreateFileToSend ( bytesToSend , sendPreAndPostBuffers , out preBuffer , out postBuffer , out sentChecksum ) ;
182177
183178 // Start server
184- var server = new Socket ( listenAt . AddressFamily , SocketType . Stream , ProtocolType . Tcp ) ;
185- server . BindToAnonymousPort ( listenAt ) ;
186-
187- server . Listen ( ListenBacklog ) ;
188-
189- var serverFinished = new TaskCompletionSource < bool > ( ) ;
190- int bytesReceived = 0 ;
191- var receivedChecksum = new Fletcher32 ( ) ;
192-
193- server . AcceptAPM ( remote =>
179+ using ( var listener = new Socket ( listenAt . AddressFamily , SocketType . Stream , ProtocolType . Tcp ) )
194180 {
195- Action < int > recvHandler = null ;
196- bool first = true ;
181+ listener . BindToAnonymousPort ( listenAt ) ;
182+ listener . Listen ( ListenBacklog ) ;
197183
198- var recvBuffer = new byte [ 256 ] ;
199- recvHandler = received =>
184+ int bytesReceived = 0 ;
185+ var receivedChecksum = new Fletcher32 ( ) ;
186+
187+ Task serverTask = Task . Run ( async ( ) =>
200188 {
201- if ( ! first )
189+ using ( var serverStream = new NetworkStream ( await listener . AcceptAsync ( ) , ownsSocket : true ) )
202190 {
203- if ( received == 0 )
191+ var buffer = new byte [ 256 ] ;
192+ int bytesRead ;
193+ while ( ( bytesRead = await serverStream . ReadAsync ( buffer , 0 , buffer . Length ) ) != 0 )
204194 {
205- remote . Dispose ( ) ;
206- server . Dispose ( ) ;
207- serverFinished . SetResult ( true ) ;
208- return ;
195+ bytesReceived += bytesRead ;
196+ receivedChecksum . Add ( buffer , 0 , bytesRead ) ;
209197 }
210-
211- bytesReceived += received ;
212- receivedChecksum . Add ( recvBuffer , 0 , received ) ;
213- }
214- else
215- {
216- first = false ;
217198 }
218-
219- remote . ReceiveAPM ( recvBuffer , 0 , recvBuffer . Length , SocketFlags . None , recvHandler ) ;
220- } ;
221-
222- recvHandler ( 0 ) ;
223- } ) ;
224-
225- // Run client
226- EndPoint clientEndpoint = server . LocalEndPoint ;
227- var client = new Socket ( clientEndpoint . AddressFamily , SocketType . Stream , ProtocolType . Tcp ) ;
228-
229- var clientFinished = new TaskCompletionSource < bool > ( ) ;
230- client . ConnectAPM ( clientEndpoint , ( ) =>
231- {
232- client . SendFileAPM ( filename , preBuffer , postBuffer , TransmitFileOptions . UseDefaultWorkerThread , ex =>
199+ } ) ;
200+ Task clientTask = Task . Run ( async ( ) =>
233201 {
234- client . LingerState = new LingerOption ( true , LingerTime ) ;
235- client . Dispose ( ) ;
236-
237- if ( ex != null )
238- {
239- clientFinished . SetException ( ex ) ;
240- }
241- else
202+ using ( var client = new Socket ( listener . LocalEndPoint . AddressFamily , SocketType . Stream , ProtocolType . Tcp ) )
242203 {
243- clientFinished . SetResult ( true ) ;
204+ await client . ConnectAsync ( listener . LocalEndPoint ) ;
205+ await Task . Factory . FromAsync (
206+ ( callback , state ) => client . BeginSendFile ( filename , preBuffer , postBuffer , TransmitFileOptions . UseDefaultWorkerThread , callback , state ) ,
207+ iar => client . EndSendFile ( iar ) ,
208+ null ) ;
209+ client . Shutdown ( SocketShutdown . Send ) ;
244210 }
245211 } ) ;
246- } ) ;
247212
248- Assert . True ( clientFinished . Task . Wait ( TestTimeout ) , "Completed within allowed time" ) ;
249- Assert . True ( serverFinished . Task . Wait ( TestTimeout ) , "Completed within allowed time" ) ;
213+ // Wait for the tasks to complete
214+ Task < Task > firstCompleted = Task . WhenAny ( serverTask , clientTask ) ;
215+ Assert . True ( firstCompleted . Wait ( TestTimeout ) , "Neither client nor server task completed within allowed time" ) ;
216+ firstCompleted . Result . GetAwaiter ( ) . GetResult ( ) ;
217+ Assert . True ( Task . WaitAll ( new [ ] { serverTask , clientTask } , TestTimeout ) , $ "Tasks didn't complete within allowed time. Server:{ serverTask . Status } Client:{ clientTask . Status } ") ;
250218
251- Assert . Equal ( bytesToSend , bytesReceived ) ;
252- Assert . Equal ( sentChecksum . Sum , receivedChecksum . Sum ) ;
219+ // Validate the results
220+ Assert . Equal ( bytesToSend , bytesReceived ) ;
221+ Assert . Equal ( sentChecksum . Sum , receivedChecksum . Sum ) ;
222+ }
253223
254224 // Clean up the file we created
255225 File . Delete ( filename ) ;
0 commit comments