How to set timeouts on socket operations (XAML)
This topic shows how to set timeouts on network socket operations in a Windows Runtime app to limit the time to wait for an operation to complete.
What you need to know
Technologies
-
Enables synchronizing activities and access to data.
-
Enables network communications using sockets and WebSockets.
Prerequisites
The following information applies to any connected or network-aware Windows Runtime app that uses sockets for network connections. This topic applies to apps written in C++/XAML and apps using the .NET Framework 4.5 in C#, VB.NET, or managed C++ on Windows 8.1, Windows Phone 8.1, and Windows Server 2012 R2.
The following examples in this topic are provided in C#. A basic understanding of sockets is recommended.
Instructions
Step 1: Overview of default timeouts on socket operations
The StreamSocket class implements a TCP socket in a Windows Runtime app. A TCP socket must establish a connection before any network data can be sent or received. The underlying TCP socket implementation in Windows 8.1, Windows Phone 8.1, and Windows Server 2012 R2 sets a default timeout on any TCP connect socket operations. The default timeout is 3 minutes (180 seconds) for each source and destination address pair when hostnames or endpoints are used. So if a destination hostname has two IP addresses, then the connect operation would not timeout until about 6 minutes have elapsed. This default timeout may well be excessive for the customer experience using a Windows Runtime app. So an app using the StreamSocket class may want to set a shorter custom timeout on stream socket connect operations.
The DatagramSocket and StreamSocket classes do not have any default timeouts when sending or receiving network data. So any send or receive operation will wait forever. A Windows Store app using sockets may want to set a timeout on these operations for a better customer experience.
The StreamSocketListener class will listen and wait forever for incoming connection requests.
Step 2: How to set custom timeouts on socket operations
The .NET Framework 4.5 implements a CancellationTokenSource class in the System.Threading namespace that can be used with a timeout. A socket operation can be run as a task with a CancellationTokenSource object to implement a timeout.
The basic model to use timeouts is the same for all three classes. The discussion below uses a connect operation on a StreamSocket as an example. The same model can be used to implement timeouts when sending or receiving network data with the DatagramSocket or StreamSocket object or when listening for incoming connections with a StreamSocketListener object.
- Create a StreamSocket.
- Create a CancellationTokenSource and set a timeout on the token.
- Run the socket operation on the StreamSocket as a task with the CancellationTokenSource object associated with the task.
- If the request fails with a TaskCanceledException exception, the socket operation timed out with our custom timeout. Close the socket to cancel the operation.
Once a socket operation is cancelled, the socket can no longer be used.
The following sample implements a custom timeout on a StreamSocket connect operation.
StreamSocket clientSocket = new StreamSocket();
HostName host = new HostName("www.contoso.com");
string port = "http";
CancellationTokenSource cts = new CancellationTokenSource();
try
{
cts.CancelAfter(10000);
await clientSocket.ConnectAsync(host, port).AsTask(cts.Token);
}
catch (TaskCanceledException)
{
clientSocket.Close();
// Debug.WriteLine("Operation was cancelled.");
}
Related topics
Other
Cancellation in Managed Threads
How to connect with a datagram socket
How to connect with a stream socket
How to secure socket connections with TLS/SSL
Reference