Back in the year 2000, I was interested in acquiring some short domain names so I wrote a Perl script to search Internic domain space. I found two consecutive unregistered domains, qslv.com and qslw.com, and so I registered them. Back then, I pointed the two domains to a simple webpage containing links to the websites I used most frequently. My reasoning was with PDA browsers, public net terminals, cell phones and other devices where character input is slow or tedious, it would be easier to enter a short URL and then follow a link than to enter the website URLs themselves.
I think that idea still has merit so I may set up those domains again one day.
Anyway, I was curious to see how many short domain names are still available so I updated the script. The rules have changed a little. Queries for .org domains now have to go to PIR instead of Internic.
#!perl -w # # Search for unregistered domains. # # Usage: perl searchdom.pl <where to start searching> # # e.g. perl searchdom.pl aaa # will check aaa.com/net/org, aab.com/net/org, aac.com/net/org, and so on # # The search string cycles from 'a' to 'z' and then from '0' to '9'. use strict; use IO::Socket; use IO::File; use Carp; BEGIN { my $pir_addr; my $nic_addr; sub getaddr { my $name = shift; my $a = gethostbyname $name or croak "Can't get address of server $name: $!\n"; inet_ntoa($a); } # Query the domain registry. For now, it only uses PIR for .org and # Internic for .com and .net. sub whois { my $dom = shift; my $server_addr = ($dom =~ /\.org$/i) ? $pir_addr : $nic_addr; my $sock = IO::Socket::INET->new(PeerAddr => $server_addr, PeerPort => 'whois', Proto => 'tcp') or croak "Can't connect to $server_addr: $@"; $sock->autoflush; print $sock "$dom\x0d\x0a"; my $out; { local $/; $out = <$sock>; } $out or croak "No data returned from server"; } $pir_addr = getaddr 'whois.publicinterestregistry.net'; $nic_addr = getaddr 'whois.internic.net'; } # Cycle through all the letters and digits. Returns the next character # after this one. sub incrchar { my $c = shift; if (ord($c) >= ord('a') and ord($c) < ord('z')) { $c = chr(ord($c) + 1); } elsif ($c eq 'z') { $c = '0'; } elsif (ord($c) >= ord('0') and ord($c) < ord('9')) { $c = chr(ord($c) + 1); } elsif ($c eq '9') { $c = 'a'; } $c; } # Increments a string with "carry". sub increment { my $index; my $str = shift; for ($index = length($$str) - 1; $index >= 0; --$index) { my $c = substr($$str, $index, 1); $c = incrchar $c; substr($$str, $index, 1) = $c; # If incrchar has wrapped back to 'a', we have to carry one to the # character to the left. last if $c ne 'a'; } return undef if $index < 0; 1; } my $str = 'aaa'; if (@ARGV) { $str = lc shift; } do { for my $tld ('.com', '.net', '.org') { my $dom = "$str$tld"; my $text = whois $dom; print "Checking $dom...\r"; # This will break very badly if domain registries change the output # format. Currently, PIR returns the former and Internic returns # the latter for unregistered domains. if ($text =~ /NOT FOUND/ or $text =~ /No match for/) { print "$dom is available\n"; } } sleep 1; } while (increment \$str); __END__
So what's still available? Based on what I've searched so far, there are some 4-character .com domains available. If you want something that is 3 characters, you will have to go with .net or .org. There are no 2-character domains available in .com, .net or .org.