implement tcp connect timeout
This commit is contained in:
parent
dad84e8a46
commit
55e7866497
|
@ -156,7 +156,8 @@ TCPListener listenTCP_s(ushort port, TCPConnectionFunction connection_callback,
|
||||||
/**
|
/**
|
||||||
Establishes a connection to the given host/port.
|
Establishes a connection to the given host/port.
|
||||||
*/
|
*/
|
||||||
TCPConnection connectTCP(string host, ushort port, string bind_interface = null, ushort bind_port = 0)
|
TCPConnection connectTCP(string host, ushort port, string bind_interface = null,
|
||||||
|
ushort bind_port = 0, Duration timeout = Duration.max)
|
||||||
{
|
{
|
||||||
NetworkAddress addr = resolveHost(host);
|
NetworkAddress addr = resolveHost(host);
|
||||||
addr.port = port;
|
addr.port = port;
|
||||||
|
@ -173,10 +174,11 @@ TCPConnection connectTCP(string host, ushort port, string bind_interface = null,
|
||||||
if (addr.family != AddressFamily.UNIX)
|
if (addr.family != AddressFamily.UNIX)
|
||||||
bind_address.port = bind_port;
|
bind_address.port = bind_port;
|
||||||
|
|
||||||
return connectTCP(addr, bind_address);
|
return connectTCP(addr, bind_address, timeout);
|
||||||
}
|
}
|
||||||
/// ditto
|
/// ditto
|
||||||
TCPConnection connectTCP(NetworkAddress addr, NetworkAddress bind_address = anyAddress)
|
TCPConnection connectTCP(NetworkAddress addr, NetworkAddress bind_address = anyAddress,
|
||||||
|
Duration timeout = Duration.max)
|
||||||
{
|
{
|
||||||
import std.conv : to;
|
import std.conv : to;
|
||||||
|
|
||||||
|
@ -193,11 +195,15 @@ TCPConnection connectTCP(NetworkAddress addr, NetworkAddress bind_address = anyA
|
||||||
scope uaddr = new RefAddress(addr.sockAddr, addr.sockAddrLen);
|
scope uaddr = new RefAddress(addr.sockAddr, addr.sockAddrLen);
|
||||||
scope baddr = new RefAddress(bind_address.sockAddr, bind_address.sockAddrLen);
|
scope baddr = new RefAddress(bind_address.sockAddr, bind_address.sockAddrLen);
|
||||||
|
|
||||||
// FIXME: make this interruptible
|
|
||||||
auto result = asyncAwaitUninterruptible!(ConnectCallback,
|
auto result = asyncAwaitUninterruptible!(ConnectCallback,
|
||||||
cb => eventDriver.sockets.connectStream(uaddr, baddr, cb)
|
cb => eventDriver.sockets.connectStream(uaddr, baddr, cb),
|
||||||
//cb => eventDriver.sockets.cancelConnect(cb)
|
(ConnectCallback cb, StreamSocketFD sock_fd) {
|
||||||
);
|
eventDriver.sockets.cancelConnectStream(sock_fd);
|
||||||
|
}
|
||||||
|
)(timeout);
|
||||||
|
|
||||||
|
if (result[1] == ConnectStatus.cancelled)
|
||||||
|
result[1] = ConnectStatus.timeout;
|
||||||
enforce(result[1] == ConnectStatus.connected, "Failed to connect to "~addr.toString()~": "~result[1].to!string);
|
enforce(result[1] == ConnectStatus.connected, "Failed to connect to "~addr.toString()~": "~result[1].to!string);
|
||||||
|
|
||||||
return TCPConnection(result[0], uaddr);
|
return TCPConnection(result[0], uaddr);
|
||||||
|
|
Loading…
Reference in a new issue