Eu encontrei alguém que realiza isso com um uso muito inteligente do Imageobjeto nativo .
Da fonte deles, essa é a função principal (ela depende de outras partes da fonte, mas você entendeu).
function Pinger_ping(ip, callback) {
if(!this.inUse) {
this.inUse = true;
this.callback = callback
this.ip = ip;
var _that = this;
this.img = new Image();
this.img.onload = function() {_that.good();};
this.img.onerror = function() {_that.good();};
this.start = new Date().getTime();
this.img.src = "http://" + ip;
this.timer = setTimeout(function() { _that.bad();}, 1500);
}
}
Isso funciona em todos os tipos de servidores que eu testei (servidores web, servidores ftp e servidores de jogos). Também funciona com portas. Se alguém encontrar um caso de uso que falhar, poste nos comentários e eu atualizarei minha resposta.
Atualização : o link anterior foi removido. Se alguém encontrar ou implementar o acima, comente e eu o adicionarei na resposta.
Atualização 2 : @trante foi bom o suficiente para fornecer um jsFiddle.
http://jsfiddle.net/GSSCD/203/
Atualização 3 : o @Jonathon criou um repositório do GitHub com a implementação.
https://github.com/jdfreder/pingjs
Atualização 4 : Parece que esta implementação não é mais confiável. As pessoas também estão relatando que o Chrome não suporta mais tudo, gerando um net::ERR_NAME_NOT_RESOLVEDerro. Se alguém puder verificar uma solução alternativa, colocarei isso como a resposta aceita.
"/?cachebreaker="+new Date().getTime();a ao final do img src, se necessário.