/**
         * Creates a new TCPIPLinkServer listening on the given address
         *
         * @param address
         *            The address to listen on for new connections
         * @//throws JCSPNetworkException
         *             Thrown if something goes wrong during the creation of the ServerSocket
         */
        public TCPIPLinkServer(TCPIPNodeAddress address)
        //throws JCSPNetworkException
        {
            try
            {
                // First check if we have an ip address in the string
                if (String.IsNullOrEmpty(address.GetIpAddressAsString()))
                {
                    IPAddress   localIPAddresstoUse = GetLocalIPAddress.GetOnlyLocalIPAddress();
                    IPAddress[] localIPAddresses    = GetLocalIPAddress.GetAllAddresses();
                    address.setIpAddress(GetLocalIPAddress.ConvertIPAddressToString(localIPAddresstoUse));
                    // Get the local IP addresses
                    //InetAddress[] local = InetAddress.getAllByName(InetAddress.getLocalHost().getHostName());
                    //InetAddress toUse = InetAddress.getLocalHost();


                    //TODO the code below is not updated and not working correctly.
                    // We basically have four types of addresses to worry about. Loopback (127), link local (169),
                    // local (192) and (possibly) global. Grade each 1, 2, 3, 4 and use highest scoring address. In all
                    // cases use first address of that score.
                    int current = 0;

                    // Loop until we have checked all the addresses
                    for (int i = 0; i < localIPAddresses.Length; i++)
                    {
                        // Ensure we have an IPv4 address
                        //if (local[i] is Inet4Address)
                        if (localIPAddresses[i] is IPAddress)
                        {
                            // Get the first byte of the address
                            //byte first = local[i].getAddress()[0];
                            byte first = localIPAddresses[i].GetAddressBytes()[0];

                            // Now check the value
                            if (first == (byte)127 && current < 1)
                            {
                                // We have a Loopback address
                                current = 1;
                                // Set the address to use
                                localIPAddresstoUse = localIPAddresses[i];
                            }
                            else if (first == (byte)169 && current < 2)
                            {
                                // We have a link local address
                                current = 2;
                                // Set the address to use
                                localIPAddresstoUse = localIPAddresses[i];
                            }
                            else if (first == (byte)192 && current < 3)
                            {
                                // We have a local address
                                current = 3;
                                // Set the address to use
                                localIPAddresstoUse = localIPAddresses[i];
                            }
                            else
                            {
                                // Assume the address is globally accessible and use by default.
                                localIPAddresstoUse = localIPAddresses[i];
                                // Break from the loop
                                break;
                            }
                        }
                    }

                    // Now set the IP address of the address
                    //address.setIpAddress(toUse.getHostAddress());
                    //address.setIpAddress(localIPAddresstoUse.ToString());

                    // Set the address part now, but it may change if we have to get a port number
                    //address.setAddress(address.GetIpAddressAsString() + ":" + address.getPort());
                }

                // Now check if the address has a port number
                if (address.getPort() == 0)
                {
                    // No port number supplied. Get one as we create the ServerSocket
                    //InetAddress socketAddress = InetAddress.getByName(address.GetIpAddressAsString());
                    //SocketAddress socketAddress = new SocketAddress(AddressFamily.InterNetwork);
                    IPEndPoint socketEndPoint =
                        new IPEndPoint(IPAddress.Parse(address.GetIpAddressAsString()),
                                       0); //port 0 as in Java's implementation

                    // Create the server socket with a random port
                    //this.serv = new ServerSocket(0, 0, socketAddress);
                    //this.serv = new TcpListener(localIPAddresstoUse.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
                    this.serv = new Socket(socketEndPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
                    this.serv.Bind(socketEndPoint);
                    this.serv.Listen(0);


                    // Assign the port to the address
                    //address.setPort(this.serv.getLocalPort());
                    address.setPort(socketEndPoint.Port);

                    // And set the address
                    address.setAddress(address.GetIpAddressAsString() + ":" + address.getPort());

                    // Set the listening address
                    this.listeningAddress = address;
                }
                else
                {
                    // Create an IP address from the NodeAddress
                    IPEndPoint inetAddress = new IPEndPoint(IPAddress.Parse(address.GetIpAddressAsString()),
                                                            address.getPort());

                    // Now create the ServerSocket
                    this.serv = new Socket(inetAddress.AddressFamily, SocketType.Stream, ProtocolType.Tcp);

                    //Bind server to the ip address - Karol Pasierb
                    this.serv.Bind(inetAddress);
                    this.serv.Listen(10); //backlog 10 for the queue  - Karol Pasierb

                    // Set listeningAddress
                    this.listeningAddress = address;
                }
            }
            catch (IOException ioe)
            {
                throw new JCSPNetworkException("Failed to create TCPIPLinkServer on: " + address.getAddress());
            }
        }
Exemple #2
0
        /**
         * Creates a new TCPIPLink
         *
         * @param address
         *            The address of the remote Node to connect to
         * @//throws JCSPNetworkException
         *             Thrown if something goes wrong during the creation process
         */
        public TCPIPLink(TCPIPNodeAddress address)
        //throws JCSPNetworkException
        {
            try
            {
                // First check if we have an ip address in the string. If not, we assume that this is to be connected
                // to the local machine but to a different JVM
                if (String.IsNullOrEmpty(address.GetIpAddressAsString()))
                {
                    IPAddress[] localIPAddresses = GetLocalIPAddress.GetAllAddresses();
                    IPAddress   ipAddresstoUse   = GetLocalIPAddress.GetOnlyLocalIPAddress();
                    address.setIpAddress(GetLocalIPAddress.ConvertIPAddressToString(ipAddresstoUse));

                    //TODO the code below is not updated and not working correctly.
                    // We basically have four types of addresses to worry about. Loopback (127), link local (169),
                    // local (192) and (possibly) global. Grade each 1, 2, 3, 4 and use highest scoring address. In all
                    // cases use first address of that score.
                    int current = 0;

                    // Loop until we have checked all the addresses
                    for (int i = 0; i < localIPAddresses.Length; i++)
                    {
                        // Ensure we have an IPv4 address
                        if (localIPAddresses[i] is IPAddress)
                        {
                            // Get the first byte of the address
                            //byte first = localIPAddresses[i].getAddress()[0];
                            byte first = localIPAddresses[i].GetAddressBytes()[0];

                            // Now check the value
                            if (first == (byte)127 && current < 1)
                            {
                                // We have a Loopback address
                                current = 1;
                                // Set the address to use
                                ipAddresstoUse = localIPAddresses[i];
                            }
                            else if (first == (byte)169 && current < 2)
                            {
                                // We have a link local address
                                current = 2;
                                // Set the address to use
                                ipAddresstoUse = localIPAddresses[i];
                            }
                            else if (first == (byte)192 && current < 3)
                            {
                                // We have a local address
                                current = 3;
                                // Set the address to use
                                ipAddresstoUse = localIPAddresses[i];
                            }
                            else
                            {
                                // Assume the address is globally accessible and use by default.
                                ipAddresstoUse = localIPAddresses[i];
                                // Break from the loop
                                break;
                            }
                        }
                    }

                    // Now set the IP address of the address
                    //address.setIpAddress(ipAddresstoUse.ToString());

                    // Set the address part.
                    //address.setAddress(address.GetIpAddressAsString() + ":" + address.getPort());
                }

                // Connect the socket to the server socket on the remote Node
                IPAddress remoteAddress = IPAddress.Parse(address.GetIpAddressAsString());
                this.socket = new Socket(remoteAddress.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
                EndPoint remoteEndPoint = new IPEndPoint(remoteAddress, address.getPort());

                // Set TcpNoDelay. Off should improve performance for smaller packet sizes, which JCSP should have in general
                this.socket.NoDelay = !TCPIPLink.NAGLE;
                this.socket.Connect(remoteEndPoint);
                // Create the input and output streams for the Link
                this.rxStream = new BinaryReader(new NetworkStream(this.socket));
                this.txStream = new BinaryWriter(new NetworkStream(this.socket));

                // Set the remote address
                this.remoteAddress = address;

                // We are not connected, so set connected to false.
                this.connected = false;

                // Log Node connection
                Node.log.log(this.GetType(), "Link created to " + address.toString());
            }
            catch (IOException ioe)
            {
                // Something went wrong during connection. Log and throw exception
                Node.err.log(this.GetType(), "Failed to create Link to " + address.toString());
                throw new JCSPNetworkException("Failed to create TCPIPLink to: " + address.getAddress());
            }
        }