//
// Copyright (c) 2007, Brian Frank and Andy Frank
// Licensed under the Academic Free License version 3.0
//
// History:
// 10 Feb 07 Brian Frank Creation
//
**
** TcpListener is a server socket that listens to a local well
** known port for incoming TcpSockets.
**
class TcpListener
{
//////////////////////////////////////////////////////////////////////////
// Construction
//////////////////////////////////////////////////////////////////////////
**
** Create a new, unbound TCP server socket. The socket will be configured
** using the given [socket configuration]`SocketConfig`. The following
** configuration applies to listeners:
** - `SocketConfig.receiveBufferSize`
** - `SocketConfig.reuseAddr`
** - `SocketConfig.acceptTimeout`
**
new make(SocketConfig config := SocketConfig.cur)
{
init(config)
}
private native This init(SocketConfig config)
//////////////////////////////////////////////////////////////////////////
// State
//////////////////////////////////////////////////////////////////////////
**
** The `SocketConfig` being used to configure the server sockets.
**
native SocketConfig config()
**
** Is this socket bound to a local address and port.
**
native Bool isBound()
**
** Is this socket closed.
**
native Bool isClosed()
//////////////////////////////////////////////////////////////////////////
// End Points
//////////////////////////////////////////////////////////////////////////
**
** Get the bound local address or null if unbound.
**
native IpAddr? localAddr()
**
** Get the bound local port or null if unbound.
**
native Int? localPort()
//////////////////////////////////////////////////////////////////////////
// Communication
//////////////////////////////////////////////////////////////////////////
**
** Bind this listener to the specified local address. If addr is null
** then the default IpAddr for the local host is selected. If port
** is null an ephemeral port is selected. Throw IOErr if the port is
** already bound or the bind fails. Return this.
**
native This bind(IpAddr? addr, Int? port, Int backlog := 50)
**
** Accept the next incoming connection. This method blocks the
** calling thread until a new connection is established. If this
** listener's `SocketConfig.acceptTimeout` is configured, then accept
** will timeout with an IOErr.
**
TcpSocket accept() { return doAccept }
private native TcpSocket doAccept()
**
** Close this server socket. This method is guaranteed to never
** throw an IOErr. Return true if the socket was closed successfully
** or false if the socket was closed abnormally.
**
native Bool close()
//////////////////////////////////////////////////////////////////////////
// Socket Options
//////////////////////////////////////////////////////////////////////////
**
** Access the SocketOptions used to tune this server socket.
** The following options apply to TcpListeners:
** - receiveBufferSize
** - reuseAddr
** Accessing other option fields will throw UnsupportedErr.
**
@Deprecated { msg = "Use SocketConfig" }
SocketOptions options()
{
return SocketOptions(this)
}
internal native Int getReceiveBufferSize()
internal native Void setReceiveBufferSize(Int v)
internal native Bool getReuseAddr()
internal native Void setReuseAddr(Bool v)
}