Let's say we are hosting on a Personal Computer and Server Program is written in Java.
1.If we host server using static IP-address then does that means we can change machine and replace it with other ones, restart machine as many times we want and our Client will still be able to communicate with us after system is back?
2.if we host server using Dynamic IP-address then just by restarting once the machine we have to tell every single client out there that new IP-address is this one?
3.Will Dynamic IP-addresses change even if we don't restart the machine ?
Yes, a static ip address means that it is fixed. There is more to the whole system, of course, since there is resolution of an IP to a MAC address. Nonetheless, a static IP (assuming it is only on the network once) means that any machine with that IP will respond. So a client can always connect to the IP address.
Note: not a very friendly way to go.
Just because something has a "dynamic" IP address does not necessarily mean it changes every single time. Using DHCP it is possible to assign the same IP address to the same MAC address each time. It is a much better approach than hardcoding an IP address to a machine.
In addition, you really should not have your clients use an IP address to connect. They should look up the machine by a name in DNS. You can coordinate the DNS lookup to the DHCP, so machines do not need to do anything but resolve the hostname.
However, as your question stands, if a machine uses DHCP and does not receive the same IP address each time, and you have your clients connecting by IP address, then on each new assignment the clients would need the new IP address.
Whether a machine's IP address updates even when it does not restart is a policy that is controlled by the DHCP server. In general, there is a renewal time for an IP address. Without going into great deal, the client during the DHCP conversation may request the same IP address, but it is up to the server as to whether to hand out the same one or not. Conversely, most servers are configured to hand out the same IP address to a given MAC address as long as the DHCP cache is current. It is completely a policy decision.
At the end of the day, however, it seems like you are attempting to tie clients to a server's IP address, and this is not a good strategy. It is a better strategy to use DNS and have the clients resolve a hostname. If I am incorrectly inferring your intent, I apologize.
NOTE: I have used DHCP as the way to give out dynamic IP addresses. You might use some other strategy, but I think the concept is the same.
1: Yes, if the server has a static IP clients will always be able to count on the server being at that IP address.
2: Most likely, yes. In many networks the DHCP server will give the same IP back to a machine that has rebooted but you certainly should not count on that.
3: Yes - dynamically assigned IP addresses have a "TTL" - a time to live. This may be a long time (weeks or more) but they still could expire and change. Most often the machine will get the same IP back but, again, you should not count on that.
Related
I have a Python server. Each time I change the network the IP changes. I want it to have a static IP over all networks so it can receive data without customizing the code every time.
I want to do the same for a Java server too.
You may talk with your ISP to rent a static IP address, although I would recommend using name instead of IP address. Means, trust a DNS server to translate the IP to the name and and thus even if the IP is changing, it will give the new IP each time. How? well there are free online name services (such as "no-ip") that you can register your IP each time, to a fixed name address.
Is there any possible way to differentiate online IP Address from Local/Other Machine IP on LAN in Java?
I am working on a application, there is a need to identify the Local IP/LAN IP and Online IP address input by user.
Thanks in advance.
As far as I am aware, there is no way to do this based solely on the IP (and that is not specific to Java, but based on the way networks work).
If you have additional information, however, you may be able to do this. There are three networks of IP addresses that are not used on the internet. Those are:
10.0.0.0/8
172.16.0.0/12
192.168.0.0/16
If you know the LAN IP addresses will be from specific ranges (including the network the host is in on which your application is runnning), you can differentiate; however - and do not try this at home kids since it will give you headaches - if you use IP addresses in your LAN that are also used on the internet, you will not only have address conflicts, but also trouble to distinguish between online and LAN IPs.
Something else though; if your users try to "connect" via the internet, but are behind a NAT, your application will only see the source of their traffic as the public IP of the gateway doing the NAT for your users. So, for example, if two of your users are somewhere in a LAN with IPs from 10.0.1.0/24, but their gateway has a public IP of 123.123.123.123, your application will see BOTH users as having the IP 123.123.123.123
You might have to come up with a different way of authentication if you intend to use this in a way similar to VPN, or you have to know all the public IPs of all gateways of all of your users who are behind NATs.
A note on terminology, as Marcelo pointed out: afaik, "online" and "offline" are not terms usually used with IPs. We rather speak of "public" (the ones seen on the internet) and "private" IPs (those within your own network noone on the internet can see).
You can get the external IP using some API such as http://automation.whatismyip.com/n09230945.asp. If you can reach that API and get the IP, you are "online" - i.e., connected to the internet. If you can't, you are "offline" (unless the host is down, etc).
If you need the local host, you can use
InetAddress thisIp =InetAddress.getLocalHost();
System.out.println("IP:"+thisIp.getHostAddress())
Please clarify what you consider an "offline IP address", as I've never heard of such concept before.
I want to find all systems that are on the same local network i.e. that have the same subnet mask.
I think I must work with InetAddress Class in Java but I don't know what should I do.
My algorithm is:
Find all available system in a local network
Check if they run on a my requested port
Keep in mind the IP of system which runs on this port
InetAddress localHost = Inet4Address.getLocalHost();
NetworkInterface networkInterface = NetworkInterface.getByInetAddress(localHost);
System.out.println(networkInterface);
networkInterface.getByInetAddress(localHost);
for (){
networkInterface.getByInetAddress(localHost)
}
I think that the networkInterface.getByInetAddress(localHost) can give me all available IP addresses in a subnet, but I don't how I can do this for all available systems, and what is the condition for the for clause.
Finding all of the possible IP addresses in an IP subnet is simple. Just write a loop that enumerates all possible byte[] representations in the subnet and constructs InetAddress instances for them.
That's the easy bit, the hard bit is solving these two problems:
how do you find all if the live IP addresses on a subnet, and
for a given IP address, how do you figure out if it is using a particular port.
The first problem can be solved in two ways:
You could use the InetAddress.isAlive() method to see if the host responds to a ping. The problem is that some hosts may be configured to not respond to pings, or the pings may be blocked by an internal firewall. This also doesn't work if the subnet is large. The problem is that you need to ping a large number of hosts, and that will take a long time and generate a lot of network traffic ... especially if there are multiple application instances doing this.
The smarter alternative is to examine your local machine's ARP cache, and extract all IP addresses that it knows about. The problem is that 1) your application may not have the access rights to access the ARP cache, 2) some IP addresses may not be in the cache, and 3) there is no way to access the ARP cache in pure Java.
The second problem depends on the nature of the service on the port:
If it is a TCP-based service, then you can attempt to connect to an IP/port using a plain socket. If the connection is accepted, then the port is in use by something. It may or may not be the service you expect, but in general the only way to tell that is to try to use the service.
If it is a UDP-based service, then there's now way in general to know if something is using the port.
I'm going to hope that you mean the following:
"I wish to discover all systems on the same local network as (the computer running my program)'s primary IP address which are listening to a certain TCP port."
With UDP, this is a slightly harder problem - you could look for bounces, but your packet may be eaten or lost (as could the reply).
Now, assuming TCP, you have three steps.
Get the IP address of the local interface you believe is the "primary" one.
Enumerate hosts on the same subnet as this address.
For each host, determine if the appropriate port is listening.
For step 1, use InetAddress.getLocalHost().
For step 2, get the subnet portion of the retrieved address, and then try every possible host within that subnet. Let's hope it's a Class C and there are only 254 hosts. There is no 100% sure way to get all the hosts without trying each one. A non-100%-certain (and more complex) way is to use ARP tables to get a router's view of the network, to send a broadcast ping to the local net, or to fall down to layer 2 and send a broadcast Ethernet packet.
For step 3, open a connection to each host on the appropriate port and then close it. If the connection times out or is denied, scratch the host. Otherwise, add it to the "listening" list. You probably want to try more than one connection at a time and set the timeout interval to something small, since most people won't be listening.
Step 4: congratulations! You've just made a very feature-poor version of nmap in Java.
I want to get all the systems connected in a LAN?
Can anyone suggest me?
The Package I used in Java to achieve this was called jcifs. Here is the link to the Library .
Please note, to identify a machine on a subnet you will need to ping all the avaliable Ip addresses on the subnet. From there you can do a reverse IP Address lookup to get the machines details.
From memory from the OSI the reason why you want to ping all the machines on the network is because ICMP is still the lowest layer on the OSI Model. Though you just cannot trust just using ICMP (ping) requests to all machines on the subnet. The reason for this is most Windows Machines to prevent fishing attacks will block that protocol. So instead, you need to take a two stage detection approach. First, broadcast over the SubNet Ip address with a ICMP ping request. From the ICMP ping request after waiting 1 second, proceed to perform a SMB connection to the non responding IP addresses. You will find that most people will have either a shared printer of Microsoft Network that will respond to a request under that port.
The alternative is to use a NetBios reverse name lookup, though it still involves spamming the IP address range of the subnet.
Hope this helps.
Why do you want them, and why must they be names? Not all systems have a name.
What kind of systems are you trying to enumerate?
If you're trying to locate nearby instances of your own application, use multicast UDP to create a discovery protocol.
If you're trying to locate some server which has its own protocol for that purpose, then use its one.
If I was going to try to implement this in Java, I'd pick some unused TCP/IP port number and then try to open a socket to each IP address in the LAN's IP address range(s). You expect all the connection attempts to fail, but they should fail in different ways depending on the whether a machine is using the IP address. If an IP address is in use, you should get a "connection refused". If it is not in use, you should get a "no route to host" or "no route to network". A "connect timed out" may indicate that the host is fire-walled, or that was recently alive but is not alive at the moment.
Another approach (which I don't know is you can do from Java) is to send ARP requests for each of the IP addresses in the network address range and see what turns up in your machine's ARP cache.
And of course, you can try sending ICMP Ping messages, but they may be firewalled.
Once you have a list of live IP addresses, use DNS reverse lookup to find the corresponding DNS names. But beware that not all IP addresses are bound to DNS names.
However this is all a bit tenuous given that a lot of machines and networks use firewalls of various kinds, and these are wont to drop network messages or send misleading responses.
Java Socket Program did not work for WAN
I have written a TCP IP socket program which works fine in my LAN.
One of my friend is at bangalore He ran the server and I ran the
client with the host name of my friend's IP. In this case my
socket program did not work.
You said that your program is attempting to connect to host 192.168.1.107 port 46216.
192 prefix specifies it is a class C address and is private. Making your program connect to that will force it to remain on the local network searching for that node. You will need to find the IP address of your router (you can use http://whatismyip.org/ to find this out). Then go into your router settings and forward port 46216 to 192.168.1.107 (your node), or even better, your MAC address which is not subject to change (in case your router is running DHCP).
on a side note, it isn't good to hardcode IP addresses. Simply use a textfield to avoid having to redistribute the client when your IP is changed, as it is likely you have a dynamic IP from your ISP.
Your friend running the server is most likely behind either a firewall or NAT. Make sure you are using the external IP address and if necessary port forwarding the packets to the correct IP.
The IP address you gave seems to be a local address, rather than a public internet address. If you are looking for 192.x.x.x, you will not make it out to "the internet", but will be confined behind your router.
WhatIsMyIP is a good way of getting a public IP address, and THAT is the address you should use in your connection. Also, be sure to forward any ports that will be used by your program, because otherwise your router will likely filter the traffic and still create an issue.
You could use an implementation of STUNT or other NAT Traversal protocol.
The ip of computer on thih u deployed your server program is not in your reach.
192.x.x.x ip means (class C) it is for local subnet.
You need to have change your ip address of your net-adapter so that your router could route it through internet.