package se.unlogic.eagledns;
import java.io.IOException;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketException;
import org.apache.log4j.Logger;
public class TCPSocketMonitor extends Thread {
private Logger log = Logger.getLogger(this.getClass());
private final EagleDNS eagleDNS;
private final InetAddress addr;
private final int port;
private final ServerSocket serverSocket;
public TCPSocketMonitor(EagleDNS eagleDNS, final InetAddress addr, final int port) throws IOException {
super();
this.eagleDNS = eagleDNS;
this.addr = addr;
this.port = port;
serverSocket = new ServerSocket(port, 128, addr);
this.setDaemon(true);
this.start();
}
@Override
public void run() {
log.debug("Starting TCP socket monitor on address " + getAddressAndPort());
while (!this.eagleDNS.isShutdown()) {
try {
final Socket socket = serverSocket.accept();
log.debug("TCP connection from " + socket.getRemoteSocketAddress());
this.eagleDNS.getTcpThreadPool().execute(new TCPConnection(eagleDNS, socket));
} catch (SocketException e) {
//This is usally thrown on shutdown
log.debug("SocketException thrown from TCP socket on address " + getAddressAndPort() + ", " + e);
} catch (IOException e) {
log.info("IOException thrown by TCP socket on address " + getAddressAndPort() + ", " + e);
}
}
log.debug("TCP socket monitor on address " + getAddressAndPort() + " shutdown");
}
public InetAddress getAddr() {
return addr;
}
public int getPort() {
return port;
}
public ServerSocket getServerSocket() {
return serverSocket;
}
public void closeSocket() throws IOException{
log.debug("Closing TCP socket monitor on address " + getAddressAndPort() + "...");
this.serverSocket.close();
}
public String getAddressAndPort(){
return addr.getHostAddress() + ":" + port;
}
}