1 // Licensed to the .NET Foundation under one or more agreements.
2 // The .NET Foundation licenses this file to you under the MIT license.
3 // See the LICENSE file in the project root for more information.
7 using System.Collections.Generic;
8 using System.Threading.Tasks;
10 namespace System.Net.Sockets
12 public static class SocketTaskExtensions
14 public static Task<Socket> AcceptAsync(this Socket socket)
16 return Task<Socket>.Factory.FromAsync(
17 (callback, state) => ((Socket)state).BeginAccept(callback, state),
18 asyncResult => ((Socket)asyncResult.AsyncState).EndAccept(asyncResult),
22 public static Task<Socket> AcceptAsync(this Socket socket, Socket acceptSocket)
24 const int ReceiveSize = 0;
25 return Task<Socket>.Factory.FromAsync(
26 (socketForAccept, receiveSize, callback, state) => ((Socket)state).BeginAccept(socketForAccept, receiveSize, callback, state),
27 asyncResult => ((Socket)asyncResult.AsyncState).EndAccept(asyncResult),
33 public static Task ConnectAsync(this Socket socket, EndPoint remoteEP)
35 return Task.Factory.FromAsync(
36 (targetEndPoint, callback, state) => ((Socket)state).BeginConnect(targetEndPoint, callback, state),
37 asyncResult => ((Socket)asyncResult.AsyncState).EndConnect(asyncResult),
42 public static Task ConnectAsync(this Socket socket, IPAddress address, int port)
44 return Task.Factory.FromAsync(
45 (targetAddress, targetPort, callback, state) => ((Socket)state).BeginConnect(targetAddress, targetPort, callback, state),
46 asyncResult => ((Socket)asyncResult.AsyncState).EndConnect(asyncResult),
52 public static Task ConnectAsync(this Socket socket, IPAddress[] addresses, int port)
54 return Task.Factory.FromAsync(
55 (targetAddresses, targetPort, callback, state) => ((Socket)state).BeginConnect(targetAddresses, targetPort, callback, state),
56 asyncResult => ((Socket)asyncResult.AsyncState).EndConnect(asyncResult),
62 public static Task ConnectAsync(this Socket socket, string host, int port)
64 return Task.Factory.FromAsync(
65 (targetHost, targetPort, callback, state) => ((Socket)state).BeginConnect(targetHost, targetPort, callback, state),
66 asyncResult => ((Socket)asyncResult.AsyncState).EndConnect(asyncResult),
72 public static Task<int> ReceiveAsync(this Socket socket, ArraySegment<byte> buffer, SocketFlags socketFlags)
74 return Task<int>.Factory.FromAsync(
75 (targetBuffer, flags, callback, state) => ((Socket)state).BeginReceive(
82 asyncResult => ((Socket)asyncResult.AsyncState).EndReceive(asyncResult),
88 public static Task<int> ReceiveAsync(
90 IList<ArraySegment<byte>> buffers,
91 SocketFlags socketFlags)
93 return Task<int>.Factory.FromAsync(
94 (targetBuffers, flags, callback, state) => ((Socket)state).BeginReceive(targetBuffers, flags, callback, state),
95 asyncResult => ((Socket)asyncResult.AsyncState).EndReceive(asyncResult),
101 public static Task<SocketReceiveFromResult> ReceiveFromAsync(
103 ArraySegment<byte> buffer,
104 SocketFlags socketFlags,
105 EndPoint remoteEndPoint)
107 object[] packedArguments = new object[] { socket, remoteEndPoint };
109 return Task<SocketReceiveFromResult>.Factory.FromAsync(
110 (targetBuffer, flags, callback, state) =>
112 var arguments = (object[])state;
113 var s = (Socket)arguments[0];
114 var e = (EndPoint)arguments[1];
116 IAsyncResult result = s.BeginReceiveFrom(
130 var arguments = (object[])asyncResult.AsyncState;
131 var s = (Socket)arguments[0];
132 var e = (EndPoint)arguments[1];
134 int bytesReceived = s.EndReceiveFrom(asyncResult, ref e);
136 return new SocketReceiveFromResult()
138 ReceivedBytes = bytesReceived,
144 state: packedArguments);
147 public static Task<SocketReceiveMessageFromResult> ReceiveMessageFromAsync(
149 ArraySegment<byte> buffer,
150 SocketFlags socketFlags,
151 EndPoint remoteEndPoint)
153 object[] packedArguments = new object[] { socket, socketFlags, remoteEndPoint };
155 return Task<SocketReceiveMessageFromResult>.Factory.FromAsync(
156 (targetBuffer, callback, state) =>
158 var arguments = (object[])state;
159 var s = (Socket)arguments[0];
160 var f = (SocketFlags)arguments[1];
161 var e = (EndPoint)arguments[2];
163 IAsyncResult result = s.BeginReceiveMessageFrom(
177 var arguments = (object[])asyncResult.AsyncState;
178 var s = (Socket)arguments[0];
179 var f = (SocketFlags)arguments[1];
180 var e = (EndPoint)arguments[2];
181 IPPacketInformation ipPacket;
183 int bytesReceived = s.EndReceiveMessageFrom(
189 return new SocketReceiveMessageFromResult()
191 PacketInformation = ipPacket,
192 ReceivedBytes = bytesReceived,
198 state: packedArguments);
201 public static Task<int> SendAsync(this Socket socket, ArraySegment<byte> buffer, SocketFlags socketFlags)
203 return Task<int>.Factory.FromAsync(
204 (targetBuffer, flags, callback, state) => ((Socket)state).BeginSend(
211 asyncResult => ((Socket)asyncResult.AsyncState).EndSend(asyncResult),
217 public static Task<int> SendAsync(
219 IList<ArraySegment<byte>> buffers,
220 SocketFlags socketFlags)
222 return Task<int>.Factory.FromAsync(
223 (targetBuffers, flags, callback, state) => ((Socket)state).BeginSend(targetBuffers, flags, callback, state),
224 asyncResult => ((Socket)asyncResult.AsyncState).EndSend(asyncResult),
230 public static Task<int> SendToAsync(
232 ArraySegment<byte> buffer,
233 SocketFlags socketFlags,
236 return Task<int>.Factory.FromAsync(
237 (targetBuffer, flags, endPoint, callback, state) => ((Socket)state).BeginSendTo(
245 asyncResult => ((Socket)asyncResult.AsyncState).EndSendTo(asyncResult),