001: /*
002: * Copyright (c) 2000 by Matt Welsh and The Regents of the University of
003: * California. All rights reserved.
004: *
005: * Permission to use, copy, modify, and distribute this software and its
006: * documentation for any purpose, without fee, and without written agreement is
007: * hereby granted, provided that the above copyright notice and the following
008: * two paragraphs appear in all copies of this software.
009: *
010: * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR
011: * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT
012: * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF
013: * CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
014: *
015: * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES,
016: * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
017: * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
018: * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO
019: * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
020: *
021: * Author: Matt Welsh <mdw@cs.berkeley.edu>
022: *
023: */
024:
025: package seda.sandStorm.lib.aSocket;
026:
027: import seda.sandStorm.api.*;
028: import java.io.*;
029: import java.net.*;
030: import java.lang.reflect.Method;
031: import java.lang.reflect.InvocationTargetException;
032:
033: /**
034: * This class represents an asynchronous server socket.
035: * An application creates an ATcpServerSocket to listen for incoming
036: * TCP connections on a given port; when a connection is received,
037: * an ATcpConnection object is pushed to the SinkIF associated with
038: * the ATcpServerSocket. The ATcpConnection is then used for communication.
039: *
040: * @author Matt Welsh
041: * @see ATcpConnection
042: *
043: */
044: public class ATcpServerSocket {
045:
046: /** Internal state used by aSocket implementation */
047: public ListenSockState lss;
048: int serverPort;
049:
050: /**
051: * Open a server socket listening on the given port. When a connection
052: * arrives, an ATcpConnection will be posted to the given compQ.
053: * If the server socket dies, an ATcpServerSocketDeadEvent will be
054: * posted instead.
055: */
056: public ATcpServerSocket(int serverPort, SinkIF compQ)
057: throws IOException {
058: this .serverPort = serverPort;
059: aSocketMgr.enqueueRequest(new ATcpListenRequest(this ,
060: serverPort, compQ, -1));
061: }
062:
063: /**
064: * Open a server socket listening on the given port. When a connection
065: * arrives, an ATcpConnection will be posted to the given compQ.
066: * If the server socket dies, an ATcpServerSocketDeadEvent will be
067: * posted instead.
068: *
069: * @param writeClogThreshold The maximum number of outstanding write
070: * requests to a connection established using this socket before a
071: * SinkCloggedEvent is pushed onto the completion queue for that
072: * connection. The default value is -1, which indicates that no
073: * SinkCloggedEvents will be generated.
074: */
075: public ATcpServerSocket(int serverPort, SinkIF compQ,
076: int writeClogThreshold) throws IOException {
077: this .serverPort = serverPort;
078: aSocketMgr.enqueueRequest(new ATcpListenRequest(this ,
079: serverPort, compQ, writeClogThreshold));
080: }
081:
082: protected ATcpServerSocket() {
083: }
084:
085: /**
086: * Request that this server socket stop accepting new connections.
087: * This request will not take effect immediately.
088: */
089: public void suspendAccept() {
090: aSocketMgr.enqueueRequest(new ATcpSuspendAcceptRequest(this ));
091: }
092:
093: /**
094: * Request that this server socket resume accepting new connections.
095: * This request will not take effect immediately.
096: */
097: public void resumeAccept() {
098: aSocketMgr.enqueueRequest(new ATcpResumeAcceptRequest(this ));
099: }
100:
101: /**
102: * Return the port that this socket is listening on.
103: */
104: public int getPort() {
105: return serverPort;
106: }
107:
108: /**
109: * Return the local port for this socket. Returns -1 if no local port
110: * has yet been established.
111: */
112: public int getLocalPort() {
113: if (lss != null) {
114: return lss.getLocalPort();
115: } else
116: return -1;
117: }
118:
119: /**
120: * Asynchronously close this server socket. An ATcpServerSocketClosedEvent
121: * will be posted to the completion queue associated with this
122: * server socket when the close completes.
123: */
124: public void close() {
125: aSocketMgr.enqueueRequest(new ATcpCloseServerRequest(this));
126: }
127:
128: }
|