Bueno viejo, te voy a explicar que es lo que sucede, el objeto winsock no te determina cuándo has terminado de descargar un archivo, ya que los archivos se van descargando por paquetes, se entra constantemente a un evento llamado "DataArrival" que se dispara automáticamente cada vez que te llega un paquete.
Lo que hice fue agregarte una rutina que busca el encabezado del paquete, que es donde se define la longitud total del archivo, y viene luego de una etiqueta "Content-Length". Te voy a ser sincero, en las pruebas que hice a veces me funciono y a veces no, pero ya te lo dejo para que vos sigas investigando al respecto, aún así espero haberte ayudado.
Te adjunto el proyecto modificado con mis cambios y si tenes alguna pregunta al respecto no dudes en preguntarme.