UdpSendReceiveState
Represents the state for a UDP send/receive operation.
Overview
The UdpSendReceiveState class is used to encapsulate the necessary information for initiating and managing asynchronous UDP send and receive operations using methods like Socket.SendToAsync and Socket.ReceiveFromAsync.
It holds the data buffer, the endpoint to send to or receive from, and any other relevant state information required for the asynchronous operation.
Members
Properties
public byte[] Buffer { get; set; }
Gets or sets the byte array that holds the data to be sent or received.
public EndPoint RemoteEndPoint { get; set; }
Gets or sets the remote endpoint to which the datagram is sent or from which it is received.
public int BytesTransferred { get; set; }
Gets or sets the number of bytes transferred during the operation.
Syntax
public sealed class UdpSendReceiveState
Constructors
public UdpSendReceiveState();
Initializes a new instance of the UdpSendReceiveState class.
public UdpSendReceiveState(byte[] buffer, EndPoint remoteEndPoint);
Initializes a new instance of the UdpSendReceiveState class with the specified buffer and remote endpoint.
| Parameter | Description |
|---|---|
buffer |
The byte array to use for sending or receiving data. |
remoteEndPoint |
The remote endpoint for the UDP communication. |
Example
This example demonstrates how to use UdpSendReceiveState with asynchronous UDP operations.
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
public class UdpExample {
private const int Port = 11000;
private static UdpClient udpClient;
private static IPEndPoint localEndPoint;
public static async Task Main(string[] args) {
try {
localEndPoint = new IPEndPoint(IPAddress.Any, Port);
udpClient = new UdpClient(localEndPoint);
Console.WriteLine("UDP client started on port {Port}");
// Start receiving asynchronously
var receiveTask = ReceiveAsync();
// Send a message asynchronously
await SendMessageAsync("Hello, UDP!", new IPEndPoint(IPAddress.Loopback, Port));
// Wait for a bit to allow receiving
await Task.Delay(1000);
// Keep the console app running
Console.WriteLine("Press Enter to exit.");
Console.ReadLine();
} catch (Exception ex) {
Console.WriteLine(ex.ToString());
} finally {
udpClient?.Close();
}
}
private static async Task ReceiveAsync() {
Console.WriteLine("Waiting for UDP packets...");
while (true) {
// UdpClient uses its own internal buffer and state management for ReceiveAsync,
// but for demonstration purposes showing how UdpSendReceiveState *could* be used
// with a lower-level Socket.ReceiveFromAsync:
// Using UdpClient.ReceiveAsync directly for simplicity here:
var result = await udpClient.ReceiveAsync();
string receivedMessage = Encoding.ASCII.GetString(result.Buffer, 0, result.BytesReceived);
Console.WriteLine($"Received from {result.RemoteEndPoint}: {receivedMessage}");
// If we were using Socket.ReceiveFromAsync, we'd do something like this:
// byte[] buffer = new byte[1024];
// EndPoint remoteEP = new IPEndPoint(IPAddress.Any, 0);
// var state = new UdpSendReceiveState(buffer, remoteEP);
// var receiveEventArgs = new SocketAsyncEventArgs();
// receiveEventArgs.RemoteEndPoint = state.RemoteEndPoint;
// receiveEventArgs.SetBuffer(state.Buffer, 0, state.Buffer.Length);
// receiveEventArgs.Completed += (sender, e) => {
// if (e.BytesTransferred > 0) {
// state.BytesTransferred = e.BytesTransferred;
// // Process received data in state.Buffer up to state.BytesTransferred
// Console.WriteLine($"Received {state.BytesTransferred} bytes from {state.RemoteEndPoint}");
// }
// };
// // For demonstration, assume we have a Socket object 'socket'
// // if (!socket.ReceiveFromAsync(receiveEventArgs)) {
// // // Handle completion synchronously
// // }
}
}
private static async Task SendMessageAsync(string message, IPEndPoint targetEndPoint) {
byte[] messageBytes = Encoding.ASCII.GetBytes(message);
// UdpClient.SendAsync handles buffer and endpoint internally
var bytesSent = await udpClient.SendAsync(messageBytes, messageBytes.Length, targetEndPoint);
Console.WriteLine($"Sent {bytesSent} bytes to {targetEndPoint}: {message}");
// If we were using Socket.SendToAsync, we'd do something like this:
// var state = new UdpSendReceiveState(messageBytes, targetEndPoint);
// var sendEventArgs = new SocketAsyncEventArgs();
// sendEventArgs.RemoteEndPoint = state.RemoteEndPoint;
// sendEventArgs.SetBuffer(state.Buffer, 0, state.Buffer.Length);
// sendEventArgs.Completed += (sender, e) => {
// state.BytesTransferred = e.BytesTransferred;
// Console.WriteLine($"Send completed. {state.BytesTransferred} bytes sent.");
// };
// // For demonstration, assume we have a Socket object 'socket'
// // if (!socket.SendToAsync(sendEventArgs)) {
// // // Handle completion synchronously
// // }
}
}