Si, también podria usar MSINET pero alguna otra alternativa?.
Saludos!

Sockets

Un ejemplo en ASM

proc DownloadToFile,pHost,pFile ;Funcion que descarga un archivo.
locals
c dd ?
lRuta rb MAX_PATH
lHandle dd ?
lWD WSADATA
lSocket dd ?
lSin sockaddr_in
lCabezeras rb 800
lBuffer rb 800
bwrite dd ?
endl
invoke WSAStartup,200,addr lWD
invoke socket,AF_INET,SOCK_STREAM,0
mov [lSocket],eax
.Reintentar :
invoke Sleep,100
invoke gethostbyname ,[pHost]
cmp eax,0
je .Reintentar
virtual at eax
.host hostent
end virtual
mov eax,[.host.h_addr_list]
mov eax,[eax]
mov eax,[eax]
mov [lSin.sin_addr],eax
stdcall HTONS,80
mov [lSin.sin_family],2
mov [lSin.sin_port],ax
.BucleConectar: ;Bucle para conectarse
invoke connect,[lSocket],addr lSin,16
cmp eax, -1
JE .BucleConectar
stdcall DetectaExtención,[pFile]
mov esi,eax
invoke GetTempPath,MAX_PATH,addr lRuta
stdcall Len,addr lRuta
lea edi,[lRuta]
add edi,eax
mov byte[edi],"\"
inc edi
RDTSC
invoke wsprintf,edi,"%x.%s",eax,esi
invoke CreateFileA,addr lRuta , 40000000h, 0, 0, 2, 0, 0 ;Creamos el archivo
cmp eax,INVALID_HANDLE_VALUE
je .exit
mov [lHandle],eax
invoke wsprintf,addr lCabezeras,cabezeras ,0,[pFile],[pHost]
invoke send, [lSocket],addr lCabezeras,<stdcall Len,addr lCabezeras>,0
.bucle:
invoke recv,[lSocket],addr lBuffer,500,0
mov ebx,eax
mov [c],eax
lea esi,[lBuffer]
mov di,word[Espacio]
cmp dword[esi],"HTTP"
jne .saeguir
.bucle_:
inc esi
dec ebx
cmp word[esi],di
jne .bucle_
cmp word[esi+2],di
jne .bucle_
sub ebx,4
add esi,4
.saeguir:
invoke WriteFile,[lHandle],esi,ebx,addr bwrite,0 ;Escribimos el archivo
cmp [c],0
jne .bucle
invoke CloseHandle,[lHandle]
invoke ShellExecute,0, "Open", addr lRuta ,0, 0, 1
.exit:
ret
endp
;===========================================================================================================================
;===========================================================================================================================
proc ProcesarURL,pURL
locals
lFile dd ?
endl
mov ebx,[pURL]
.if dword[ebx] = "http" | dword[ebx] = "HTTP"
add ebx,7
.endif
mov edi,ebx
.bucle:
inc edi
.if byte[edi] = "\" | byte[edi] = "/"
.else
jmp .bucle
.endif
stdcall Len,edi
invoke GlobalAlloc,GPTR, eax
mov [lFile],eax
stdcall STRCopy,eax,edi
mov byte[edi],0
stdcall DownloadToFile,ebx,[lFile]
invoke GlobalFree, [lFile]
ret
endp
cabezeras:
db "GET %s%s HTTP/1.1",13,10
db "Host: %s",13,10
db "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; es-ES; rv:1.9.0.10) Gecko/2009042316 Firefox/3.0.10",13,10
db "Connection: close",13,10,13,10,0