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.
5 using System.Collections.Generic;
6 using System.Threading.Tasks;
8 namespace System.Net.Sockets
10 public static class SocketTaskExtensions
12 public static Task<Socket> AcceptAsync(this Socket socket)
14 return Task<Socket>.Factory.FromAsync(
15 (callback, state) => ((Socket)state).BeginAccept(callback, state),
16 asyncResult => ((Socket)asyncResult.AsyncState).EndAccept(asyncResult),
20 public static Task<Socket> AcceptAsync(this Socket socket, Socket acceptSocket)
22 const int ReceiveSize = 0;
23 return Task<Socket>.Factory.FromAsync(
24 (socketForAccept, receiveSize, callback, state) => ((Socket)state).BeginAccept(socketForAccept, receiveSize, callback, state),
25 asyncResult => ((Socket)asyncResult.AsyncState).EndAccept(asyncResult),
31 public static Task ConnectAsync(this Socket socket, EndPoint remoteEndPoint)
33 return Task.Factory.FromAsync(
34 (targetEndPoint, callback, state) => ((Socket)state).BeginConnect(targetEndPoint, callback, state),
35 asyncResult => ((Socket)asyncResult.AsyncState).EndConnect(asyncResult),
40 public static Task ConnectAsync(this Socket socket, IPAddress address, int port)
42 return Task.Factory.FromAsync(
43 (targetAddress, targetPort, callback, state) => ((Socket)state).BeginConnect(targetAddress, targetPort, callback, state),
44 asyncResult => ((Socket)asyncResult.AsyncState).EndConnect(asyncResult),
50 public static Task ConnectAsync(this Socket socket, IPAddress[] addresses, int port)
52 return Task.Factory.FromAsync(
53 (targetAddresses, targetPort, callback, state) => ((Socket)state).BeginConnect(targetAddresses, targetPort, callback, state),
54 asyncResult => ((Socket)asyncResult.AsyncState).EndConnect(asyncResult),
60 public static Task ConnectAsync(this Socket socket, string host, int port)
62 return Task.Factory.FromAsync(
63 (targetHost, targetPort, callback, state) => ((Socket)state).BeginConnect(targetHost, targetPort, callback, state),
64 asyncResult => ((Socket)asyncResult.AsyncState).EndConnect(asyncResult),
70 public static Task<int> ReceiveAsync(this Socket socket, ArraySegment<byte> buffer, SocketFlags socketFlags)
72 return Task<int>.Factory.FromAsync(
73 (targetBuffer, flags, callback, state) => ((Socket)state).BeginReceive(
80 asyncResult => ((Socket)asyncResult.AsyncState).EndReceive(asyncResult),
86 public static Task<int> ReceiveAsync(
88 IList<ArraySegment<byte>> buffers,
89 SocketFlags socketFlags)
91 return Task<int>.Factory.FromAsync(
92 (targetBuffers, flags, callback, state) => ((Socket)state).BeginReceive(targetBuffers, flags, callback, state),
93 asyncResult => ((Socket)asyncResult.AsyncState).EndReceive(asyncResult),
99 public static Task<SocketReceiveFromResult> ReceiveFromAsync(
101 ArraySegment<byte> buffer,
102 SocketFlags socketFlags,
103 EndPoint remoteEndPoint)
105 object[] packedArguments = new object[] { socket, remoteEndPoint };
107 return Task<SocketReceiveFromResult>.Factory.FromAsync(
108 (targetBuffer, flags, callback, state) =>
110 var arguments = (object[])state;
111 var s = (Socket)arguments[0];
112 var e = (EndPoint)arguments[1];
114 IAsyncResult result = s.BeginReceiveFrom(
128 var arguments = (object[])asyncResult.AsyncState;
129 var s = (Socket)arguments[0];
130 var e = (EndPoint)arguments[1];
132 int bytesReceived = s.EndReceiveFrom(asyncResult, ref e);
134 return new SocketReceiveFromResult()
136 ReceivedBytes = bytesReceived,
142 state: packedArguments);
145 public static Task<SocketReceiveMessageFromResult> ReceiveMessageFromAsync(
147 ArraySegment<byte> buffer,
148 SocketFlags socketFlags,
149 EndPoint remoteEndPoint)
151 object[] packedArguments = new object[] { socket, socketFlags, remoteEndPoint };
153 return Task<SocketReceiveMessageFromResult>.Factory.FromAsync(
154 (targetBuffer, callback, state) =>
156 var arguments = (object[])state;
157 var s = (Socket)arguments[0];
158 var f = (SocketFlags)arguments[1];
159 var e = (EndPoint)arguments[2];
161 IAsyncResult result = s.BeginReceiveMessageFrom(
175 var arguments = (object[])asyncResult.AsyncState;
176 var s = (Socket)arguments[0];
177 var f = (SocketFlags)arguments[1];
178 var e = (EndPoint)arguments[2];
179 IPPacketInformation ipPacket;
181 int bytesReceived = s.EndReceiveMessageFrom(
187 return new SocketReceiveMessageFromResult()
189 PacketInformation = ipPacket,
190 ReceivedBytes = bytesReceived,
196 state: packedArguments);
199 public static Task<int> SendAsync(this Socket socket, ArraySegment<byte> buffer, SocketFlags socketFlags)
201 return Task<int>.Factory.FromAsync(
202 (targetBuffer, flags, callback, state) => ((Socket)state).BeginSend(
209 asyncResult => ((Socket)asyncResult.AsyncState).EndSend(asyncResult),
215 public static Task<int> SendAsync(
217 IList<ArraySegment<byte>> buffers,
218 SocketFlags socketFlags)
220 return Task<int>.Factory.FromAsync(
221 (targetBuffers, flags, callback, state) => ((Socket)state).BeginSend(targetBuffers, flags, callback, state),
222 asyncResult => ((Socket)asyncResult.AsyncState).EndSend(asyncResult),
228 public static Task<int> SendToAsync(
230 ArraySegment<byte> buffer,
231 SocketFlags socketFlags,
232 EndPoint remoteEndPoint)
234 return Task<int>.Factory.FromAsync(
235 (targetBuffer, flags, endPoint, callback, state) => ((Socket)state).BeginSendTo(
243 asyncResult => ((Socket)asyncResult.AsyncState).EndSendTo(asyncResult),