Thread overview | |||||
---|---|---|---|---|---|
|
November 15, 2020 How can I set Timeout of Socket? | ||||
---|---|---|---|---|
| ||||
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. |
November 15, 2020 Re: How can I set Timeout of Socket? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Marcone | 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.
Perhaps using Socket.select and SocketSet?
import std.socket;
import std.stdio;
import core.time;
void main()
{
Socket s = new Socket(AddressFamily.INET, SocketType.STREAM);
s.blocking = false;
auto set = new SocketSet(1);
set.add(s);
s.connect(new InternetAddress("dlang.org", 80));
scope(exit) s.close();
Socket.select(null, set, null, dur!"seconds"(10));
if (set.isSet(s))
{
writeln("socket is ready");
}
else
{
writeln("could not connect");
}
}
|
November 15, 2020 Re: How can I set Timeout of Socket? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Marcone | 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). |
Copyright © 1999-2021 by the D Language Foundation