/** * there is an issue with this method: if it is called often enough, the <CODE> * _s.sendUrgentData(0);</CODE> method that it invokes, will force the <CODE>_s</CODE> socket to * close on the other end, at least on Windows systems. This behavior is due to the fact that * OOB data handling is problematic since there are conflicting specifications in TCP. * Therefore, it is required that the method is not called with high frequency (see the <CODE> * PDBTExecSingleCltWrkInitSrv._CHECK_PERIOD_MSECS</CODE> flag in this file.) * * @return true iff the worker is available to accept work according to all evidence. */ private synchronized boolean getAvailability() { boolean res = _isAvail && _s != null && _s.isClosed() == false; if (res && _OK2SendOOB) { // work-around the OOB data issue // last test using OOB sending of data try { _OK2SendOOB = false; // indicates should not send OOB data until set to true _s.sendUrgentData(0); // unfortunately, if this method is called often enough, // it will cause the socket to close??? res = true; } catch (IOException e) { // e.printStackTrace(); utils.Messenger.getInstance() .msg("PDBTExecSingleCltWrkInitSrv.getAvailability(): Socket has been closed", 0); res = false; _isAvail = false; // declare availability to false as well // try graceful exit try { _s.shutdownOutput(); _s.close(); // Now we can close the Socket } catch (IOException e2) { // silently ignore } } } return res; }
public void shutdownOutput() throws IOException { mSocket.shutdownOutput(); }