New BIND server, client trouble [solved]

I am learning BIND and have a local machine set up as a caching server and a server for the local network.
I was having problems with other machines on the local network not being able to see the server.  The "listen-on" entry in named.conf only had 127.0.0.1 in it, so I changed this to:
listen-on {127.0.0.1; 192.168.7.0/24;};
Now the other machines on the network can find the server and resolve local network names correctly.  However, the linux machines can't seem to resolve names on the Internet. If I ping www.google.com, I get an "Unknown host" error.  I also can't run pacman sucessfully, I get an error:
error: failed retrieving file 'core.db.tar.gz' from distro.ibiblio.org : No address record
for all servers.  I found another post with the suggestion of adding
XferCommand = /usr/bin/wget -4 --passive-ftp -c -O %o %u
to pacman.conf, but that just gave different errors.
There are some windows xp machines on the network, and they seem to be able to ping fine.
The server can successfully resolve Internet names, and can successfully run pacman.
I did try adding an external nameserver and reordering my resolv.conf file as suggested in this thread:
http://bbs.archlinux.org/viewtopic.php?id=89334
but then I again can't resolve the other local machines.
Now I'm just guessing......
Taking out the "search mylocal.lan" line from resolv.conf and replacing it with "domain mylocal.lan" allows me to resolve local and Internet names, but not to run pacman.
Last edited by timm (2010-03-23 15:59:06)

timm wrote:resolve local network names correctly.  However, the linux machines can't seem to resolve names on the Internet
You have not defined allow-recursion.
E.g. snippets from my BIND config:
acl trusted { 127.0.0.1; 192.168.5.16; };
options {
listen-on-v6 { none; };
listen-on { 127.0.0.1; 192.168.5.15; };
// Allows only specific hosts to use the DNS server
allow-query { trusted; };
// Lock down recursive queries too, to be on the safe side
allow-recursion { trusted; };

Similar Messages

  • New OD server, client computers see Network Accounts, but no passwords work

    I set up 10.5 server on my mini, set up DHCP, DNS, OD Master, etc. From the computer bound it to the OD domain, but when I click on the Network User account from the login screen on my MBP and type in my password, it just shakes, like the password is wrong, and it is not.
    However, if I chose Other... and type in diradmin and the password, it logs in just fine. This leads me to believe it is just some sort of permissions issue, since obviously it can use the LDAP to authenticate the diradmin account, which isn't local on the MBP.
    Any thoughts BESIDES blow away the mini and start over. I hate that solution.

    timm wrote:resolve local network names correctly.  However, the linux machines can't seem to resolve names on the Internet
    You have not defined allow-recursion.
    E.g. snippets from my BIND config:
    acl trusted { 127.0.0.1; 192.168.5.16; };
    options {
    listen-on-v6 { none; };
    listen-on { 127.0.0.1; 192.168.5.15; };
    // Allows only specific hosts to use the DNS server
    allow-query { trusted; };
    // Lock down recursive queries too, to be on the safe side
    allow-recursion { trusted; };

  • [Solved] Have issues starting a new X Server in XFCE

    I'm trying to launch a WINE application in a new X Server and I get an error telling me xfce session manager already exists. How can I get around this?
    >xinit env WINEPREFIX="/home/mark/.local/share/wineprefixes/SWG" wine /home/mark/.local/share/wineprefixes/SWG/drive_c/Program\ Files/Launchpad\ Enhanced/LaunchpadEnhanced.exe -- :1
    xfce4-session: Another session manager is already running
    xinit: connection to X server lost
    waiting for X server to shut down Server terminated successfully (0). Closing log file.
    Last edited by Virum (2013-06-21 17:36:20)

    Okay I made progress!
    I installed Openbox. I guess I need to use a new WM to avoid conflicting with XFCE-session?
    #!/bin/sh
    # ~/.xinitrc
    # Executed by startx (run your window manager from here)
    export GTK2_RC_FILES="$HOME/.gtkrc-2.0"
    DEFAULT_SESSION=xfce4-session
    case $1 in
    lwm) exec lwm;;
    openbox) exec openbox-session;;
    xterm) exec dbus-launch xterm;;
    xfce) exec dbus-launch xfce4-session ;;
    *) exec dbus-launch $DEFAULT_SESSION ;;
    esac
    I am running into one issue im trying to solve.
    Im trying launch the new session AND start an application in it. So I use the command:
    > xinit openbox xchat -- :10
    Im using xchat for testing the command. The new session starts, Openbox loads, but my application does not. I need to start it in openbox manually.
    Also I can get to openbox using CTRL+ALT+2 can I change this to CTRL+ALT+8 somehow?

  • Trouble creating new application server connection

    Hi. I am trying to create a new application server connection in jdev 10.1.3.1.0. I am taking all of the default settings in the wizard, and I am specifiying user name, password and checking deploy password. When I click test connection on the last screen of the wizard I get:
    Error while getting remote MBeanServer for url: ormi://localhost:23791/default:
    Error reading application-client descriptor: Error communicating with server: Connection refused: connect; nested exception is:
         javax.naming.CommunicationException: Connection refused: connect [Root exception is java.net.ConnectException: Connection refused: connect]
    Does anybody know how to correct this?
    Thank you.

    Hello Anil,
    The error that you are getting indicates that the user that you are using to install the dialog server does not have enough rights to connect to the SAPMNT share of the central instance. 
    Please do the following:
    1.) Make sure that you are using a domain admin ID or a local admin ID that is on both systems with the same password.
    2.) Verify that SAPMNT is shared on the central instance by using the "net share" command from a Windows command prompt.
    3.) Make sure that the domain admin or local admin group is added to the file level permissions and share level permissions of SAPMNT with full rights.
    Also the general install guides will also have instructions on how to install a dialog instance as well.
    Hope this helps you,
    Thomas Wagner

  • Why won't my clients register with my new WSUS server??

    Hi All,Been running WSUS 3.0 SP2 on Server 2008 for a good few years now (originally moved away from it running on Server 2003 when I first started in my current role), and a couple of days back, I finally got round to throwing up a new 2012 VM with the WSUS role installed...When I moved clients from the 2003 WSUS to the 2008 instance, literally all I did was change the intranet location in the GPO I had created for WSUS to point to the 2008 server, and voila! Clients started reporting in within a few hours!This time, it's been 2 days now, and even though I've changed the GPO, and verified that it has updated on the clients by using GPResult, none of them have contacted the new WSUS server yet...I've tried running wuauclt with the /detectnow and /reportnow switches, and nothing.How exasperating!
    This topic first appeared in the Spiceworks Community

    Hi All,Been running WSUS 3.0 SP2 on Server 2008 for a good few years now (originally moved away from it running on Server 2003 when I first started in my current role), and a couple of days back, I finally got round to throwing up a new 2012 VM with the WSUS role installed...When I moved clients from the 2003 WSUS to the 2008 instance, literally all I did was change the intranet location in the GPO I had created for WSUS to point to the 2008 server, and voila! Clients started reporting in within a few hours!This time, it's been 2 days now, and even though I've changed the GPO, and verified that it has updated on the clients by using GPResult, none of them have contacted the new WSUS server yet...I've tried running wuauclt with the /detectnow and /reportnow switches, and nothing.How exasperating!
    This topic first appeared in the Spiceworks Community

  • Migrating clients from one DHCP server (in forest A) to a new DHCP server (in forest B)

    The scenario:  clients have recently been migrated from one forest to a new forest but are currently using the DHCP server located in the old forest.  The goal is to force the clients to start leasing from the new DHCP server in the new forest
    as soon as possible.  The users are still on the same network segment with the same address range.  There is currently DNS forwarding between the two forests.

    Keep in mind, during the transition, DNS for both the old forest and the new forest must have resolution setup between them, such as using Forwarding. This way with configuring DNS for DHCP clients (DHCP option 006), they'll still be able to resolve
    the new forest name still using the old DNS. However, keep in mind, registration will not work until you switch over to the new forest's DNS.
    As for Option 015, the Connection Specific Search Suffix, I would avoid using that until all machines have been migrated.
    AD DS and DNS Server Migration: Post-Migration Tasks
    http://technet.microsoft.com/en-us/library/dd392270(v=ws.10).aspx
    DHCP Server Migration Guide
    http://technet.microsoft.com/en-us/library/dd379535.aspx
    Ace Fekay
    MVP, MCT, MCSE 2012, MCITP EA & MCTS Windows 2008/R2, Exchange 2013, 2010 EA & 2007, MCSE & MCSA 2003/2000, MCSA Messaging 2003
    Microsoft Certified Trainer
    Microsoft MVP - Directory Services
    Complete List of Technical Blogs: http://www.delawarecountycomputerconsulting.com/technicalblogs.php
    This posting is provided AS-IS with no warranties or guarantees and confers no rights.

  • New Primary Server....now how to redirect clients?

    We installed a new primary server (22) to replace an aging primary server (14) on Tuesday. I can manually unregister clients and register to the new server (22) but want to know if there is an easier way to force the clients to show that they are connected to the new server (22) so I can shutdown the old server (14).
    Any & all advice is MUCH appreciated!!!!!

    If you follow the doc you don't need to do anything at device level exept to refresh... But yes if you want to, then you could call a batch/script that does the reregistration, through a bundle
    Originally Posted by purplecone
    I saw that....just didn't know if I could do this via a bundle to keep from having to visit all of the workstations.

  • Non-blocking Server/Client is blocking...?!

    First, a simple question:
    Why in most example code using Selectors, when iterating over the Set returned by Selector.selectedKeys() does the currently selected SelectionKey get removed from the Iterator? I see it all the time, but since the SelectionKey is still bound to the underlying Selector it seems to not really do anything.
    Now to my main problem:
    I been working with 1.4 for a week now trying to implement a simple test server/client, whereby the server constantly sends out the current time to any subscribing clients, who in turn display the time to stdout. Pretty straight forward, huh?
    Well, everything seems to go fine...once. The Server accepts the client connection, sends out a the current time, the client (only one for now) receives it, displays to the screen, but then both server and client block on the Selector.select() method.
    If I shut down the client, the server then continues through the select() method, finding one SelectionKey, tries to write to it and throws an IOException (since the client is no more). I'm catching that exception and then removing the channel from the Selector, so that the server may continue to service requests.
    When starting a second client while the first is still running causes the following sequence of events:
    Server: starts up
    ClientA: connects to server
    Server: broadcasts the time
    ClientA: displays time
    // nothing else happens until...
    ClientB: connects to server
    Server: broadcasts the time
    ClientA: displays time
    ClientB: displays time
    //everything blocks again...
    ClientA: disconnects from server
    Server: broadcasts the time
    ClientB: displays time
    As you can see it seems everything blocks until a client does something (connect/disconnect).
    I will post code if anyone asks, but I don't want to spam the board if no one is willing to help me.
    -Justin

    You got it!
    //   ********** SERVER **********
    import java.io.IOException;
    import java.net.InetSocketAddress;
    import java.net.ServerSocket;
    import java.net.Socket;
    import java.nio.ByteBuffer;
    import java.nio.channels.CancelledKeyException;
    import java.nio.channels.SelectionKey;
    import java.nio.channels.Selector;
    import java.nio.channels.ServerSocketChannel;
    import java.nio.channels.SocketChannel;
    import java.util.Date;
    import java.util.Iterator;
    import java.util.LinkedList;
    import java.util.Set;
    public class TestServer
      private static final int DEFAULT_PORT = 9999;
      public static void main(String[] args)
        TestServer s = new TestServer();
      }//end of main(String[])
      public TestServer()
        this(DEFAULT_PORT);
      }// end of TestServer()
      public TestServer(int port)
        InetSocketAddress addr = new InetSocketAddress(port);
        try
          Selector acceptSelector = Selector.open();
          Selector broadcastSelector = Selector.open();
          ConnectionList connections = new ConnectionList(broadcastSelector);
          Acceptor a = new Acceptor(acceptSelector, addr, connections);
          Broadcaster b = new Broadcaster(broadcastSelector, connections);
          a.start();
          b.start();
        }// end of try
        catch (Exception ex)
          ex.printStackTrace();
        }// end of catch
      }// end of TestServer(int)
      private static String status(Selector s)
        StringBuffer sb = new StringBuffer(100);
        sb.append("Selector: ");
        Set keys = s.keys();
        sb.append("\n\tNum Keys: ");
        sb.append(keys.size());
        Iterator iter = keys.iterator();
        int i = 0;
        while (iter.hasNext())
          try
            sb.append("\n\t[");
            sb.append(i++);
            sb.append("]:");
            SelectionKey key = (SelectionKey)iter.next();
            sb.append(" acceptable=");
            sb.append(key.isAcceptable());
            sb.append(" connectable=");
            sb.append(key.isConnectable());
            sb.append(" readable=");
            sb.append(key.isReadable());
            sb.append(" writable=");
            sb.append(key.isWritable());
          }// end of try
          catch (CancelledKeyException cke)
            sb.append("*** CANCELLED KEY");
          }// end of catch
        }// end of while
        return sb.toString();
      }// end of status(Selector)
      class Broadcaster extends Thread
        private final String TF = Broadcaster.class.getName();
        private int BUFFER_SIZE = 2048;
        private Selector selector_;
        private ConnectionList connections_;
        private ByteBuffer buffer_;
        public Broadcaster(Selector selector, ConnectionList connections)
          super("Broadcaster");
          selector_ = selector;
          connections_ = connections;
          buffer_ = ByteBuffer.allocateDirect(BUFFER_SIZE);
        public void run()
          while (true)
            try
              registerNewChannels();
              System.out.println("BroadcasterThread: Before select() "+status(selector_));
              System.out.println("BroadcasterThread: Selecting...");
              int keysReady = selector_.select();
              System.out.println("BroadcasterThread: After select() "+status(selector_));
              System.out.println("BroadcasterThread: "+keysReady+" ready Key(s)");
              if (keysReady > 0)
                transmit();
              }// end of if
            }// end of try
            catch (Exception ex)
              ex.printStackTrace();
              return;
            }// end of catch
          }// end of while
        protected void registerNewChannels()
        throws Exception
          SocketChannel channel = null;
          while (null != (channel = connections_.removeFirst()))
            channel.configureBlocking(false);
            channel.register(selector_, SelectionKey.OP_WRITE);
            System.out.println("BroadcasterThread: Registered connection from " + channel.socket().getInetAddress());
          }// end of while 
        }// end of registerNewChannels()
        public void transmit()
        throws Exception
          Set readyKeys = selector_.selectedKeys();
          System.out.println("BroadcasterThread: Selected Keys: "+readyKeys.size());
          SelectionKey tempKey = null;
          SocketChannel tempChannel = null;
          fillBuffer();
          for (Iterator i = readyKeys.iterator(); i.hasNext(); )
            tempKey = (SelectionKey)i.next();
            tempChannel = (SocketChannel)tempKey.channel();
            if (tempKey.isWritable())
              System.out.println("BroadcasterThread: Key selected is Writable");
              try
                tempChannel.write(buffer_);
                System.out.println("BroadcasterThread: Sent message to "+tempChannel.socket().getInetAddress());
              }// end of try
              catch (IOException ioe)
                System.err.println("BroadcasterThread: Lost Connection");
                tempChannel.close();
              }// end of catch
            }// end of if
            else
              System.out.println("BroadcasterThread: Key selected is not Writable");
            }// end of else
          }// end of for
          buffer_.clear();
        }// end of transmit()
        private void fillBuffer()
          buffer_.clear();
          /* Place Date in Buffer */
          long time = System.currentTimeMillis();
          Date d = new Date(time);
          System.out.println("BroadcasterThread: Broadcasting "+d);
          String date = d.toString()+"\n";
          byte[] datebuff = date.getBytes();
          buffer_.put(datebuff);
          /* Prepare for read operations */
          buffer_.flip();
        }// end of fillBuffer()
      }//end of inner class Broadcaster
      class Acceptor extends Thread
        private Selector selector_;
        private ConnectionList connList_;
        private final String TF = Acceptor.class.getName();
        public Acceptor(Selector selector, InetSocketAddress address, ConnectionList connList)
          super("Acceptor");
          selector_ = selector;
          connList_ = connList;
          try
            ServerSocketChannel ssc = ServerSocketChannel.open();
            ssc.configureBlocking(false);
            ssc.socket().bind(address);
            System.out.println("AcceptorThread: Bound to " + address);
            ssc.register(selector_, SelectionKey.OP_ACCEPT);
          }// end of try
          catch (Exception ex)
            ex.printStackTrace();
          }// end of catch
        public void run()
          while (true)
            try
              System.out.println("AcceptorThread: Selecting...");
              int keysReady = selector_.select();// block till a channel is ready
              System.out.println("AcceptorThread: "+keysReady+" Keys Ready");
              if (keysReady > 0)
                acceptPendingConnections();
              }// end of if
            catch (Exception ex)
              ex.printStackTrace();
        protected void acceptPendingConnections()
        throws Exception
          Set readyKeys = selector_.selectedKeys();
          System.out.println("AcceptorThread: Selected "+readyKeys.size()+" Keys");
          for (Iterator i = readyKeys.iterator(); i.hasNext(); )
            SelectionKey key = (SelectionKey)i.next();
            i.remove();  
            ServerSocketChannel readyChannel = (ServerSocketChannel)key.channel();
            SocketChannel incomingChannel = readyChannel.accept();
            System.out.println("AcceptorThread: Connection from " + incomingChannel.socket().getInetAddress());
            connList_.add(incomingChannel);
          }// end of for
        }// end of acceptPendingConnections()
      }// end of inner class Acceptor
      class ConnectionList
        private LinkedList list_;
        private Selector selectorToNotify_;
        public ConnectionList(Selector toNotify)
          list_ = new LinkedList();
          selectorToNotify_ = toNotify;
        }// end of ConnectionList(Selector)
        public synchronized void add(SocketChannel newlyConnectedChannel)
          list_.add(newlyConnectedChannel);
          selectorToNotify_.wakeup();
        }// end of add(SocketChannel)
        public synchronized SocketChannel removeFirst()
          SocketChannel first = null;
          if (list_.size() > 0)
            first = (SocketChannel)list_.removeFirst();
          }//end of if
          return first;
        }// end of removeFirst()
      }// end of inner class ConnectionList
    }// end of class TestServer
    //   ********** CLIENT **********
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.net.InetSocketAddress;
    import java.nio.ByteBuffer;
    import java.nio.channels.CancelledKeyException;
    import java.nio.channels.Channels;
    import java.nio.channels.ReadableByteChannel;
    import java.nio.channels.SelectionKey;
    import java.nio.channels.Selector;
    import java.nio.channels.SocketChannel;
    import java.nio.channels.WritableByteChannel;
    import java.util.Iterator;
    import java.util.Set;
    public class TestClient
      public static final String TF = TestClient.class.getName();
      private static final String DEFAULT_SERVER_IP = "127.0.0.1";
      private static final int DEFAULT_SERVER_PORT = 9999;
      private InetSocketAddress serverAddr_; 
      private Selector connectSelector_;
      private Selector readSelector_; 
      private WritableByteChannel outputChannel_; 
      private ByteBuffer receiveBuffer_;
      private SocketChannel serverChannel_;
      public static void main(String[] args)
        TestClient c = new TestClient();
      }// end of main(String[])
      public TestClient()
        this(DEFAULT_SERVER_IP, DEFAULT_SERVER_PORT);
      }// end of TestClient()
      public TestClient(String ip, int port)
        try
          serverAddr_ = new InetSocketAddress(ip, port);
          connectSelector_ = Selector.open();
          readSelector_ = Selector.open();
          outputChannel_ = Channels.newChannel(System.out);
          receiveBuffer_ = ByteBuffer.allocateDirect(512);
          connect();
          run();
        }// end of try
        catch (Exception ex)
          ex.printStackTrace();
        }// end of catch
      }// end of TestClient(String, int)
      private void connect()
      throws Exception
        serverChannel_ = SocketChannel.open();
        serverChannel_.configureBlocking(false);
        serverChannel_.connect(serverAddr_);
        serverChannel_.register(connectSelector_, SelectionKey.OP_CONNECT);
        int numKeys = 0;
        while (numKeys <= 0)
          System.out.println("connect(): Selecting...");
          numKeys = connectSelector_.select();
          System.out.println("connect(): "+numKeys+" ready Key(s)");
          Set readyKeys = connectSelector_.selectedKeys();
          System.out.println("connect(): Selected Keys: "+readyKeys.size());
          if (numKeys > 0)
            SelectionKey tempKey = null;
            SocketChannel tempChannel = null;
            Iterator i = readyKeys.iterator();
            while (i.hasNext())
              tempKey = (SelectionKey)i.next(); 
              i.remove();  
              tempChannel = (SocketChannel)tempKey.channel();
              if (tempKey.isConnectable())
                System.out.println("connect(): Key selected is Connectable");
                if (tempChannel.isConnectionPending())
                  System.out.println("connect(): Connection Pending");
                  tempChannel.finishConnect();
                  System.out.println("connect(): Connection Completed");
                }// end of if
              }// end of if
              else
                System.out.println("connect(): Key selected is not Connectable");
              }// end of else
            }// end of while
          }// end of if
        }// end of while
      }// end of connect()
      private void run()
      throws Exception
        serverChannel_.register(readSelector_, SelectionKey.OP_READ);
        while (true)
          System.out.println("run(): Before select() "+status(readSelector_));
          System.out.println("run(): Selecting...");
          int numKeys = readSelector_.select();
          System.out.println("run(): After select() "+status(readSelector_));
          System.out.println("run(): "+numKeys+" Ready Key(s)");
          if (numKeys > 0)
            processKeys();
          }// end of if
        }// end of while
      }// end of run()
      private void processKeys()
      throws Exception
        Set readyKeys = readSelector_.selectedKeys();
        System.out.println("processKeys(): Selected Keys: "+readyKeys.size());
        SelectionKey tempKey = null;
        SocketChannel tempChannel = null;
        for (Iterator i = readyKeys.iterator(); i.hasNext(); )
          tempKey = (SelectionKey)i.next();
          tempChannel = (SocketChannel)tempKey.channel();
          if (tempKey.isReadable())
            System.out.println("processKeys(): Key selected is Readable");
            try
              tempChannel.read(receiveBuffer_);
              receiveBuffer_.flip();
              outputChannel_.write(receiveBuffer_);
              receiveBuffer_.clear();
            }// end of try
            catch (IOException ioe)
              System.out.println("processKeys(): Lost Connection");
              tempKey.cancel();
            }// end of catch
          }// end of if
          else
            System.out.println("processKeys(): Key selected is not Readable");
          }// end of else
        }// end of for
      }// end of processKeys()
      private static String status(Selector s)
        StringBuffer sb = new StringBuffer(100);
        sb.append("Selector: ");
        Set keys = s.keys();
        sb.append("\n\tNum Keys: ");
        sb.append(keys.size());
        Iterator iter = keys.iterator();
        int i = 0;
        while (iter.hasNext())
          try
            sb.append("\n\t[");
            sb.append(i++);
            sb.append("]:");
            SelectionKey key = (SelectionKey)iter.next();
            sb.append(" acceptable=");
            sb.append(key.isAcceptable());
            sb.append(" connectable=");
            sb.append(key.isConnectable());
            sb.append(" readable=");
            sb.append(key.isReadable());
            sb.append(" writable=");
            sb.append(key.isWritable());
          }// end of try
          catch (CancelledKeyException cke)
            sb.append("*** CANCELLED KEY");
          }// end of catch
        }// end of while
        return sb.toString();
      }// end of status(Selector)
    }// end of class TestClient

  • Need an example of server / client program with swing interface

    Hi!
    After a lot of trying i still haven't managed to create a server client program using swing components ...
    can someone write a mini application to demonstrate how this can be done?
    i would like to have a frame with a button a texField for input and a textAread for the output
    What i have in mind is the following ..
    say im the server
    i write something in the textField and then i press the button
    then the information written in the textFiled is passed to the client who shows it in his textArea
    The same thing goes on with the client (he can write something in his own textField and when he presses the button the info is passed at the
    server who puts it in his textArea) and vice versa.
    i have written many classes that trying unsuccessfully to do that ... below i show my last attempt ...
    I would appreciate if you could write a small application which it could to this.
    The whole idea is to create a turn based game ( i have implemented the game engine and graphics and i try to add the internet function)
    Here is the code ...( i would appreciate if you write a new code instead of trying to correct mine ( which i think it's impossible) in order to use it as a general example)
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    @SuppressWarnings("serial")
    *  In order to have a more gereral program instead of passing strings between the server
    *  and the client a pass an MyObjext object.  The MyObject class has an integer and a String
    *  (which is always the same) field . At the textField i write an integer number and i
    *  make a new MyObject which i want to pass to the server or the client and vice versa.
    *  The textArea shows the integer value of the MyObject which was passed from the server /client
    public class MyUserInterface extends JFrame {
         MyObject returnObject;
         JTextField myTextField;
         JTextArea te ;
         ClientGame cg;
         ServerGame sg;
          * used to determine if the current instance is running as a client or host
         boolean isHost;
         //The constructor of the client
         public MyUserInterface(ClientGame cg){
              this("Client");
              this.cg = cg;
              isHost = false;
         //The constructor of the server
         public MyUserInterface(ServerGame sg){
              this("Server");
              this.sg = sg;
              isHost = true;
         //The general constructor used both by client and server ..
         // it initializes the GUi components and add an actionListenr to the button
         public MyUserInterface(String str) {
              super(str);
              myTextField = new JTextField(2);
              te = new JTextArea();
              te.setPreferredSize(new Dimension(100,100));
              JButton okButton = new JButton("Ok");
              okButton.addActionListener(new ActionListener() {
                   @Override
                   public void actionPerformed(ActionEvent e) {
                        try{
                             int a = Integer.parseInt(MyUserInterface.this.myTextField.getText());
                             System.out.println(a);   //used to control the flow of the program
                                  MyUserInterface.this.returnObject = new MyObject(a);
                             //sends the data
                             sendData();
                             //waiting for response...
                             getData();
                             catch(Exception ex){System.out.println("Error in the UI action command" +
                                                                ex.printStackTrace();}
              JPanel panel =  new JPanel(new FlowLayout());
              panel.add(okButton);
              panel.add(myTextField);
              panel.add(te);
              setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
              getContentPane().add(panel);
              pack();
              setVisible(true);
         protected MyObject getReturnObject() {
              return returnObject;
         public void sendData(){
              new Thread(new Runnable() {
                   @Override
                   public void run() { 
                        if (!isHost)cg.sentData(returnObject);    //using the Servers out and in methods
                        else sg.sentData(returnObject);                    //using the Clients out and in methods
                        System.out.println("data sending");
         public MyObject getData(){
              MyObject obj;
              System.out.println("Retrieveing Data");
              if (!isHost)obj = (MyObject)cg.getData();
              else obj = (MyObject)sg.getData();
              System.out.println(" data retrieved  = "+ obj.getInt());  //just to control how the code flows
              te.setText(obj.getInt()+"");       
              return obj;
         public static void main(String[] args) {
              *Initiating the Server
              new Thread(new Runnable() {
                   @Override
                   public void run() {
                        ServerGame sg = new ServerGame();
                        new MyUserInterface(sg);
              }).start();     
               * Initiating the Client
              new Thread(new Runnable() {
                   @Override
                   public void run() {
                        ClientGame cg = new ClientGame("192.168.178.21");   //<----in case you run my code
                                                                          //..don't forget to change to your
                        new MyUserInterface(cg);                              //ip
              }).start();
    import java.io.*;
    import java.net.*;
    public class ClientGame {
         String ipAddress;
         Socket clientSocket = null;
        ObjectOutputStream out = null;
        ObjectInputStream in = null;
         public ClientGame(String ipAddress) {
              this.ipAddress = ipAddress;
              try {
                   System.out.println("Connecting To Host");
                 clientSocket = new Socket(InetAddress.getByName(ipAddress),4444);
                System.out.println("Host Found ...Io initializaton");
                out = new ObjectOutputStream(clientSocket.getOutputStream());
                in = new ObjectInputStream(clientSocket.getInputStream());
            } catch (UnknownHostException e) {
                System.err.println("Don't know about host: taranis.");
                System.exit(1);
            } catch (IOException e) {
                System.err.println("Couldn't get I/O for the connection to: taranis.");
                System.exit(1);
         public Object getData(){
              Object fromServer = null ;
              do{
                 try {
                      fromServer = in.readObject();
                 catch(ClassNotFoundException ex){}
                  catch(IOException e){}
              }while(fromServer==null);
              return fromServer;        
         public void sentData(final Object obj){
              new Thread(new Runnable() {
                   @Override
                   public void run() {
                        try{
                             out.writeObject(obj);
                        catch(IOException e){}
              }).start();
         public void terminateConnection(){
              try{
                   out.close();
                   in.close();
                   clientSocket.close();
              catch (IOException e){}
    public class ServerGame {
         ServerSocket serverSocket;
         Socket clientSocket;
         ObjectOutputStream out = null;
        ObjectInputStream in = null;
         public ServerGame() {
              try{
                   serverSocket = new ServerSocket(4444);
                   clientSocket = serverSocket.accept();
                   out =  new ObjectOutputStream(clientSocket.getOutputStream());
                in = new ObjectInputStream(clientSocket.getInputStream());
              catch(IOException e){System.out.println("IOException in ServerGame");}
         public Object getData(){
              Object fromClient = null ;
              do{
                 try {
                      fromClient = in.readObject();
                 catch(ClassNotFoundException ex){}
                  catch(IOException e){}
              }while(fromClient==null);
             return fromClient;        
         public void sentData(final Object obj){
              new Thread(new Runnable() {
                   @Override
                   public void run() {
                        try{
                   out.writeObject(obj);
              catch(IOException e){}
              }).start();
         public void terminateConnection(){
              try{
                   out.close();
                   in.close();
                   clientSocket.close();
                   serverSocket.close();
              catch (IOException e){}
         public static void main(String[] args) {
              new ServerGame();
    import java.io.Serializable;
    * this is a test object
    * it has a String field and a value
    *  The string is always the same but the integer value is defined in the constructor
    public class MyObject implements Serializable{
         private static final long serialVersionUID = 1L;
         String str;
         int myInt;
         MyObject(int a){
              str = "A String";
              myInt = a;
         public int getInt(){
              return myInt;
    }

    Pitelk wrote:
    I believe that a good code example can teach you things ;that you would need many days of searching; in no timeSo lets write one small example.. Ill help a little, but you do most of the work.
    jverd approach is deffenetly the way to go.
    jverd wrote:
    * Write a very small, simple Swing program with an input area, an output area, and a button. When you click the button, what's in the input area gets copied over to the output area.This part is partially done.
    * Write a very small, simple client/server program without Swing. It should just send a couple of hardcoded messages back and forth.And this part is for you(Pitelk) to continue on. I cannot say that this is the best way. or that its good in any way. I do however like to write my client/server programs like this. And perhaps, and hopefully, Ill learn something new from this as well.
    This is how far I got in about 10-20min..
    package client;
    * To be added;
    * A connect method. That connects the client to the server and
    * opens up both the receive and transmit streams. After doing that
    * the an instance of the ServerListener class should be made.
    * Also an disconnect method could be usable. But thats a later part.
    public class TestClass1 {
    package utils;
    import java.io.ObjectInputStream;
    import client.TestClass1;
    * This class is meant to be listening to all responses given from
    * the server to the client. After a have received data from the
    * server. It should be forwarded to the client, in this case
    * TestClass1.
    public class ServerListener implements Runnable {
         public ServerListener(ObjectInputStream in, TestClass1 tc) {
         @Override
         public void run() {
              while(true) {
    package server;
    import java.io.ObjectOutputStream;
    import java.net.Socket;
    import java.util.ArrayList;
    import java.util.List;
    * This class should handle all data sent to the server from the clients.
    class Server implements Runnable {
         private static List<ObjectOutputStream> outStreams = new ArrayList<ObjectOutputStream>();
         private Socket client = null;
         public Server(Socket client) {
              this.client = client;
         @Override
         public void run() {
              while(true) {
    * The meaning of this class is to listen for clients trying to connect
    * to the server. Once connection is achieved a new thread for that client
    * should be made to listen for data sent by the client to the server.
    public class ChatServer implements Runnable {
         @Override
         public void run() {
              while(true) {
    package utils;
    import java.io.Serializable;
    @SuppressWarnings("serial")
    public class MyObject implements Serializable {
         private String mssg;
         private String clientID;
         private String clientName;
         public MyObject(String mssg, String clientID, String clientName) {
              this.mssg = mssg;
              this.clientID = clientID;
              this.clientName = clientName;
         //Generate getters and setters..
    }Continue on this, and when you get into problems etc post them. Also show with a small regular basis how far you have gotten with each class or it might be seen as you have lost intresst and then this thread is dead.
    EDIT: I should probably also say that Im not more than a java novice, at the verry most. So I cannot guarantee that I alone will be able to solve all the problems that might occure during this. But Im gonna try and help with the future problems that may(most likely will) occure atleast(Trying to reserve my self incase of misserable failiure from me in this attempt).
    Edited by: prigas on Jul 7, 2008 1:47 AM

  • Binding Windows Clients to 10.7 OD Master

    Has anyone here been able to bind Windows Clients to a 10.7 OD Master?

    syedzaidi.nyc wrote:
    http://help.apple.com/advancedserveradmin/mac/10.7/#apd52648A71-571A-433C-81A8-2 A7792333F22
    States how one can do this.
    @schoysi, however, I have run into the same problem as you. I am getting conflicting responses. The people at Apple were not able to provide an adequate answer and I am confused as heck. Would love to know if anyone has gotten this simple functionality to work. I know that PDC, SAMBA, and WINS are removed from both Windows 7 and 10.7 Server, however, OD is authenticating through DNS which would allow me to think that a Windows user should be able to bind through a domain name.
    I would love to get as much help as possible on this. I myself have been trying every situation, and need to know if I am doing anything wrong. I truly appreciate the support.
    Thanks,
    Syed
    The above Apple documentation suggests you can bind a Windows Vista or Windows 7 (but not XP) client to a Lion Server. However it also reads like it is talking about a PDC style domain which like you I thought was not possible with Lion Server.
    Lion Server has a totally new written by Apple themselves replacement for Samba. The widely believed reason Apple did this was that when Samba switched to a GPL 3.0 license it made it effectively impossible for Apple to continue using Samba code. As the replacement code in Lion is brand new it does not yet address all needs and is likely to have a number of bugs as well.
    One would hope that as time goes on Apple will be improving the new code just like iCal Server made great strides as each version was released.
    I don't have a spare PC + Windows license to experiment with and Microsoft's ghastly production activation makes it a pain to redo the same machine several times.
    The 'Golden Triangle' approach is definitely stated by Apple to work. This involves connecting a Lion Server to a Windows Active Directory system. One would logically also bind the Windows client to the same Active Directory system but then be able to also access the Mac server with the same account as used in Active Directory.
    Of course not everyone has an Active Directory setup nor wants one. Hence in the long run the desire for Apple to eventually provide enough capability to do it all itself. This is in Samba 4 i.e. it is supposed to be able to act as a poor mans Active Directory server, but that is covered by the GPL 3.0 license as mentioned above.

  • Voicemail access issue when migrated to new Domino server

    st1\:*{behavior:url(#ieooui) }
    /* Style Definitions */
    table.MsoNormalTable
    {mso-style-name:"Table Normal";
    mso-tstyle-rowband-size:0;
    mso-tstyle-colband-size:0;
    mso-style-noshow:yes;
    mso-style-parent:"";
    mso-padding-alt:0in 5.4pt 0in 5.4pt;
    mso-para-margin:0in;
    mso-para-margin-bottom:.0001pt;
    mso-pagination:widow-orphan;
    font-size:10.0pt;
    font-family:"Times New Roman";}
    At the current time we have one Domino v7.0.4 server (Win2k with DUC v1.2.3) in production and our clients are running Notes v7.0.4 client with DUC v.1.2.3 installed on them. This setup has been working great in our Unity v5.0(1) environment. We are looking to migrate our users to a newly installed Domino v8.5.1 (Win 2008 x32 DUC v1.2.5) server in the near future but out test users are running into a problem.
    When a user gets migrated over to our new Domino server the client can no longer access their voicemail via TUI.  During the user migration process we do change the pointer in Unity to their mail file on the new Domino server. When the user logs in they receive "Your messages are available now"
    If we migrate the user back to the old v7.0.4 server they can access their voice mail with no issues.
    Any feedback you could provide would be great. Thanks!

    Hi Kenneth,
    Could you clarify what you mean by "During the user migration process we do change the pointer in Unity to their mail file on the new Domino server"? Typically when moving a user's mail file to a new Domino server, Unity should automatically pick up those changes. Are you pehaps creating a new mail file and pointing Domino to it instead of moving it? If that is the case, the new mail file would not have been DUCS enabled, a process it must go through before Unity will be able to access it properly. The only way to force that to happen would be to reimport the user into Unity. If the mail file is properly migrated, however, the mail file should remain DUCS enabled and there would be no need for this.
    An easy way to determine whether the user is DUCS enabled is using the DUT tool. It is located on the Unity server under \Commserver\Utilities\Domino\DUT. It will show you a list of all of your users. Compare the values you see in the UCProfile section for a working / non-migrated user to a failing one. You might also want to verify that it lists the updated mail server and mail file for the user.
    Also, while I don't think it would cause this particular problem, you should be aware that Server 2008 is not currently a supported platform for DUCS/CsServer 1.2.5, see page 6 in the admin guide:
    http://www.cisco.com/en/US/docs/voice_ip_comm/unity/duc/admin/guide/cuducag.pdf
    Hope this helps,
    Pat

  • New Mail server setup

    Greetings,
    I need some pro's cons, Ideas taunts and general whaddia thinks.
    Setting up a new mail server. dpG5 xserve w/ 10,000 rpm drives
    my thoughts are to take the user information off the machine to a second G5 xserve running as an ODM.
    I thought about splitting IMAP/pop services to another box. keeping my primary SMTP Spam/AV away from cyrus, relaying inbound messages to the IMAP server.
    so I would have
    ODM.mydomain
    SMTP1.mydomain
    IMAP1.mydomain
    -- Does anyone see any performance or configuration hick ups here?
    now comes the ugly question.
    How do I set up each smtp server. the imap server is still going to have to run smtp to deliver and recieve delivery of messages. but I need them to answer for mydomain, not host1.mydomain. I'm a little foggy on what comes first
    --j

    There are multiple ways of achieving this.
    The simplest is for the servers to deliver via smtp to each other.
    So (very very simplified):
    Since you said you use OD, I assume all servers will refer to your OD master for user account details.
    Server 1 (Filter)
    Postfix & amavisd & ClamAV & spamassassin
    main.cf and master.cf should be configured like you are used to now except that you only want to be able to send to the content filter and nowhere else.
    In amavisd.conf uncomment and change IP (to IP of SMTP/IMAP server) of this line:
    $forward_method = 'smtp:127.0.0.1:10025';
    No relay settings needed, because you want mail to go the filter first and not to another SMTP server.
    Server 2 (Mail Stores)
    Postfix & Cyrus
    main.cf and master.cf should be configured like you are used to now except that you do not want any kind of filtering anymore. Also set to accept only from Server 1 (since it should not accept incoming mail from the outside world directly)
    Server 3 (Outgoing SMTP)
    Postfix
    main.cf and master.cf should be configured like you are used to now except that you do not need to accept incoming mail. Also no filtering needed (unless you want to scan outgoing mail)
    Mail clients:
    Point incoming to Server 2 and outgoing to Server 3
    That's pretty much it. I know it's not a walkthrough , but then again this kind of setup is better fully understood rather than copied step-by-step.
    Let me know if you need anything else.
    Alex
    P.S.
    -Optionally you could use Server 3 as a secondary MX for backup reasons.
    -For most Postfix settings see : http://www.postfix.org/postconf.5.html
    -All of this can be further improved with firewall rules

  • Oracle 10g - Creating a new Application Server using standalone OC4J 10g

    I have some issues in creating a new app. server using standalone oc4j 10g 10.1.3 instance. After I created the app. server instance, I tested the connection and it says connection refused. I used the userid as oc4jadmin and the password as welcome. I am getting a message connection refused. For connection, I used the default hostname "localhost" and I didn't mention anything in the URL path.

    Thanks Steve..
    Here is what I am trying to do.. I want to create a new app server instance (i.e.) stand alone oc4j server, where I can deploy my web service and run a test.
    Oracle JDeveloper 10g:
    Under Connection Navigator, Application Server --
    1) Right click to 'Create New Application Server Connection'
    2) Connection type as 'Standalone OC4J 10 g 10.1.3',
    3) Username ==> oc4jadmin, Password ==>welcome, checked the Deploy password.
    4) Hostname: localhost RMI Port: 23791
    URL path: <<blank>>
    5) Test Connection ==> getting a error message...
    Error while getting remote MBeanServer for url: ormi://localhost:23791/default:
    Error reading application-client descriptor: Error communicating with server: Connection refused: connect; nested exception is:
         javax.naming.CommunicationException: Connection refused: connect [Root exception is java.net.ConnectException: Connection refused: connect]
    Any input you can provide would be of great help.

  • New M5000 server - Can't get bge0 to work in the OS

    Just recently powered up a new M5000 server. Went through the setup process of setting the networking details of the management card - which I believe also works through ethernet0 (LAN#0). That is working just fine and is what I have used to access the system console. Single domain, nothing odd in the configuration.
    The pre-installed Solaris sees bge0 and bge1. It also shows the ppp connection for the dscp.
    if config shows a normal adapter config but without the RUNNING flag. cfgadm shows the drivers properly loaded. There are cables connected to both NIC cards. The same result, btw, on the bge1 card. The NIC's show activity LED's so there is definitely a physical connection there.
    What else can I provide to get assist anyone in helping me solve this problem?
    Thanks
    Norm Dressler

    Hi all, I'm new to the forum
    Have installed the above mentioned server running the x86 platform with Solaris 10 1/08 with broadcom ethernet adaptor cards.
    My network connections are giving issues. bge0 and bge1both show physical activity and these are my configs
    # ifconfig -a
    lo0: flags=2001000849<UP,LOOPBACK,RUNNING,MULTICAST,IPv4,VIRTUAL> mtu 8232 index 1
    inet 127.0.0.1 netmask ff000000
    bge0: flags=1000843<UP,BROADCAST,RUNNING,MULTICAST,IPv4> mtu 1500 index 2
    inet 192.168.1.170 netmask ffffff00 broadcast 192.168.1.255
    ether 0:11:25:22:1f:26
    bge0: flags=1000843<UP,BROADCAST,RUNNING,MULTICAST,IPv4> mtu 1500 index 3
    inet 10.0.0.1 netmask ffffff00 broadcast 10.255.255.255
    ether 0:11:25:22:1f:27
    My default router also exists
    # vi /etc/defaultrouter
    192.168.1.254
    ~
    The hosts file
    # vi /etc/hosts
    ::1          localhost
    127.0.0.1 localhost
    192.168.1.170 hostname1      loghost
    10.0.0.1      hostname1
    ~
    ~
    And the device files
    # vi /etc/hostname.bge0
    hostname1
    ~
    ~
    # vi /etc/hostname.bge1
    hostname2
    ~
    ~
    All these including restart procedures aren't working.
    I dont seem to be able to get to other devices on the network yet the local TCP/IP stack behaves just OK. I can ping all the interfaces but cannot ping any device on the network.
    During install too, I attempted to acquire a dhcp address via the network from a dhcp server that serves IPs to our network but failed thus proceeded to static addressing.
    Any advice please?

  • Issue when Bursting reports via new Precalculation Server

    Hello,
    We are trying to migrate away from our unsupported 720 installation of the SAP Precalculation software to a new Precalculation Server running the latest versions. We’ve overcome a number of issues and we can successfully Broadcast using the new server but we are encountering problems
    with bursting.
    The Bursts have been running successfully on the old 720 server, so we know that the BW side must be fine which suggests the problem is with the Precalculation server. We have been through the Precalculation checklist and the servers appears to have been built successfully. The Precalculation and Business Explorer software has been patched to the latest version and it’s running Excel 2013.
    The main error message we are seeing is “The RPC server is unavailable” HRESULT: 0x800706BA.
    A Screen shot showing the error in RSRD_LOG  is shown in the attached document.
    Below is an extract from the Log of the Precalc server showing this error, just before the RPC Server is unavailable message it states
    Error occured on closing opened workbooks.
    |ZPREC730_1:9/3/2014 2:10:20 PM.777 (0) -> Refresh
    BExAnalyzer.xla!MenuRefreshPrecalc failed 1 time(s | 
    |). BExAnalyzer.xla!MenuRefreshPrecalc failed 1 time(s                                             

    |ZPREC730_1:9/3/2014 2:10:25 PM.785 (0) -> Calling refresh
    BExAnalyzer.xla!MenuRefreshPrecalc       
    |
    |ZPREC730_1:9/3/2014 2:10:25 PM.785 (0) -> Refresh
    BExAnalyzer.xla!MenuRefreshPrecalc failed 2 time(s |

    |). BExAnalyzer.xla!MenuRefreshPrecalc failed 2 time(s                                             

    |ZPREC730_1:9/3/2014 2:10:30 PM.792 (0) -> Calling refresh BExAnalyzer.xla!MenuRefreshPrecalc        |

    |ZPREC730_1:9/3/2014 2:10:30 PM.792 (0) -> Refresh
    BExAnalyzer.xla!MenuRefreshPrecalc failed 3 time(s

    |). BExAnalyzer.xla!MenuRefreshPrecalc failed 3 time(s                                                |

    |ZPREC730_1:9/3/2014 2:10:35 PM.800 (0) -> Calling refresh
    BExAnalyzer.xla!MenuRefreshPrecalc       

    |ZPREC730_1:9/3/2014 2:10:35 PM.800 (0) -> Refresh
    BExAnalyzer.xla!MenuRefreshPrecalc failed 4 time(s |

    |). BExAnalyzer.xla!MenuRefreshPrecalc failed 4 time(s                                             

    |ZPREC730_1:9/3/2014 2:10:40 PM.808 (0) -> Calling refresh
    BExAnalyzer.xla!MenuRefreshPrecalc       

    |ZPREC730_1:9/3/2014 2:10:40 PM.808 (0) -> Refresh BExAnalyzer.xla!MenuRefreshPrecalc
    failed 5 time(s |

    |). BExAnalyzer.xla!MenuRefreshPrecalc failed 5 time(s                                             

    |ZPREC730_1:9/3/2014 2:10:45 PM.815 (0) -> Refresh
    BExAnalyzer.xla!MenuRefreshPrecalc returned with 0 |

    |. BExAnalyzer.xla!MenuRefreshPrecalc returned with 0                                               

    |ZPREC730_1:9/3/2014 2:10:45 PM.815 (0) -> Error occured on closing
    opened workbooks.                |

    |ZPREC730_1:9/3/2014 2:10:45 PM.815 -> An Exception  occured in thread '0':                          |

    |ZPREC730_1:The RPC server is unavailable. (Excepti on from HRESULT:
    0x800706BA)                      |

    |ZPREC730_1:System.Runtime.InteropServices.COMExcep tion (0x800706BA):
    The RPC server is unavailable. |

    |(Exception from HRESULT: 0x800706BA) tion (0x800706BA): The RPC server
    is unavailable.              |
    When this error occurs an error is reported in the Event Viewer on the server
    Faulting application name: EXCEL.EXE, version: 15.0.4535.1507, time stamp: 0x52282875
    Faulting module name: EXCEL.EXE, version: 15.0.4535.1507, time stamp: 0x52282875
    Exception code: 0xc0000005
    Fault offset: 0x005b447e
    Faulting process id: 0x%9
    Faulting application start time: 0x%10
    Faulting application path: %11
    Faulting module path: %12
    Report Id: %13
    We have the latest 730 patches installed on the Precalculation and Business Explorer software. We are running Excel 2013 (32bit) on a Virtual Machine running Windows 2008 R2.
    If you have any suggestions on how to resolve this problem I'd be delighted to hear from you!
    Many thanks,
    Mark

    Hi,
    There is no easy fix for this. Please go through the precalc check list which should solve the issue:
    Checklist for Precalculation Server - SAP NetWeaver Business Warehouse - SCN Wiki
    Regards,
    Michael

Maybe you are looking for

  • How to view PDF in web site?

    Hi, I build a web page that has a embedded PDF form.My question is following:      1 If The client have to install adobe reader when the client want to see the PDF form.      2 If the client can get a popup to ask him install Adobe reader when the cl

  • Web Server 6.1SP4 errors on start

    After installing and configuring JES Web Server 6.1 SP4, every time I start it up, I get the following output: info: CORE3016: daemon is running as super-user info: CORE5076: Using [Java HotSpot(TM) Server VM, Version 1.5.0_01] from [Sun Microsystems

  • Help - ipod bust but apple dont agree

    erm quite basically, i was getting really rubbish battery life(3 or 4 secs) from my ipod. i sent it away for servicing to get it replaces or refurbished whatever. apple sen tit back saying nothin was wrong and in an acceptable state. using it in skl

  • Check Availability @ nearest BestBuy Store is not always accurate...

    I could say that I am old fashioned and prefer to purchase in person at my local BestBuy or retailer. The problem I have with BestBuy is that when I see an item on www.bestbuy.com and it gives me the option to check availability & it shows that I can

  • Why does Safari (and other OS programs) provide only one option for launching an application?

    I greatly appreciate the improvements that came with the Mavericks OS, but either I cannot figure it out, or there is more that Apple can improve. Firefox is my default browser that opens when I click a link. (I do this because I can set Firefox to p