How can I set Timeout of Socket?

Anonymouse zorael at gmail.com
Sun Nov 15 14:01:37 UTC 2020


On Sunday, 15 November 2020 at 00:05:08 UTC, Marcone wrote:
> Socket s = new Socket(AddressFamily.INET, SocketType.STREAM);
> s.connect(new InternetAddress("domain.com", 80));
>
> I want that program raise an error if reach for example 30 
> seconds of timeout.

My program does something like this. (untested)

Socket s = new TcpSocket;
s.setOption(SocketOptionLevel.SOCKET, SocketOption.RCVTIMEO, 
30.seconds);
s.setOption(SocketOptionLevel.SOCKET, SocketOption.SNDTIMEO, 
30.seconds);

auto addresses = getAddress("domain.com", 80);
bool isConnected;

foreach (address; addresses)
{
     try
     {
         s.connect(address);
         isConnected = true;
         break;
     }
     catch (SocketException e)
     {
         // Failed, try next address
         writeln(e.msg);
     }
}

if (!isConnected) return false;  // failed to connect

// Connected

You can tell whether a read timed out by looking at the amount of 
bytes read (when `Socket.receive` returns `Socket.ERROR`) and the 
value of `std.socket.lastSocketError` (and/or 
`core.stdc.errno.errno` equaling EAGAIN).


More information about the Digitalmars-d-learn mailing list