/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License (the "License").
* You may not use this file except in compliance with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* or http://www.opensolaris.org/os/licensing.
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at usr/src/OPENSOLARIS.LICENSE.
* If applicable, add the following below this CDDL HEADER, with the
* fields enclosed by brackets "[]" replaced with your own identifying
* information: Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*/
/*
* Copyright (c) 2001 by Sun Microsystems, Inc.
* All rights reserved.
*
*/
// StreamListener.java: Listen to stream socket, spawn request to
// handle incoming request.
// Author: James Kempf
// Created On: Mon May 18 13:31:40 1998
// Last Modified By: James Kempf
// Last Modified On: Tue Jan 12 11:03:30 1999
// Update Count: 24
//
package com.sun.slp;
import java.util.*;
import java.net.*;
import java.io.*;
/**
* Listen on the SLP port for clients requesting a stream connection. Spawn
* a request handler to handle the connection.
*
* @author James Kempf, Erik Guttman
*/
class StreamListener extends Thread {
private ServerSocket serverSocket = null; // The listening socket
private InetAddress interfac = null; // The interface.
static private SLPConfig config = null; // Config object
static private Hashtable listeners = new Hashtable(); // Stream listeners
// Initialize a stream (TCP) listener on an interface.
static void initializeStreamListenerOnInterface(InetAddress interfac)
throws ServiceLocationException {
// If we've got it, return.
if (listeners.get(interfac) != null) {
return;
}
// Get config object.
if (config == null) {
config = SLPConfig.getSLPConfig();
}
// Create the new stream listener.
StreamListener listener = new StreamListener(interfac);
// Start it running.
listener.start();
}
private StreamListener(InetAddress interfac)
throws ServiceLocationException {
int qn = config.getServerSocketQueueLength();
// Create a server socket for incoming Stream connections.
try {
serverSocket = new ServerSocket(Defaults.iSLPPort,
qn,
interfac);
} catch (IOException ex) {
throw new ServiceLocationException(
ServiceLocationException.NETWORK_INIT_FAILED,
"socket_creation_failure",
new Object[] {interfac, ex.getMessage()});
}
// Record.
listeners.put(interfac, this);
this.interfac = interfac;
}
// Listen to port 427, accept incoming connections, pass the socket
// off to a new RequestHandler to process.
public void run() {
setName("SLP Stream Listener");
long lLastIOE = 0;
// Loop, blocking on acceptence of connections.
while (true) {
Socket s = null;
try {
s = serverSocket.accept(); // will block here
if (config.traceMsg() && s != null) {
config.writeLog("sl_incoming",
new Object[] {
s.getInetAddress().toString(),
interfac});
}
// Set socket timeout in case something goes wrong.
if (s != null) {
s.setSoTimeout(config.getTCPTimeout());
}
} catch (SocketException ex) {
if (config.traceMsg()) {
config.writeLog("sl_sock_timeout",
new Object[] {
s.getInetAddress().toString(),
interfac,
ex.getMessage()});
}
continue;
} catch (IOException ex) {
long lThisIOE = System.currentTimeMillis();
Assert.slpassert((lThisIOE - lLastIOE >= 250),
"sls_repeat_failure",
new Object[0]);
lLastIOE = lThisIOE;
continue;
}
RequestHandler rh = new RequestHandler(s, interfac, config);
rh.start();
}
}
}