Estou surpreso que ninguém tenha mencionado cURL . É feito exatamente para o que você deseja fazer. E está disponível em praticamente qualquer plataforma (incluindo o Windows).
Portanto, para o seu exemplo, tudo o que você faria é:
curl -H 'Content-Type: text/plain' -d 'Hello World' www.example.com
Que capturado no Wireshark te renderá:
POST / HTTP/1.1
User-Agent: curl/7.19.7 (x86_64-pc-linux-gnu) libcurl/7.19.7 OpenSSL/0.9.8k zlib/1.2.3.3 libidn/1.15
Host: www.example.com
Accept: */*
Content-Type: text/plain
Content-Length: 11
Hello world
Você pode facilmente modificar os cabeçalhos se quiser fazer todo tipo de coisas (ou seja, alterar o user agent, etc).
Editar: não percebeu o requisito "de um arquivo". Você pode fazer isso também, seja em arquivos ascii ou binários simples. Você acabou de especificar o nome do arquivo com um símbolo @
-d @/tmp/HelloWorldFile