вот очень сырой код с использованием сокетов для работы по протоколу tcp.
Код:

#include <windows.h>
#include <stdio.h>
SOCKET sClient;
WSADATA lpWSAData;
char *http_user_agent="Mozilla/4.0 (compatible; MSIE 5.0; Win32)";
static char Rec[2048000];
char szFile[MAX_PATH]="test";
HANDLE hFile;
bool SendString(SOCKET sClient,char* str);
char* GetString(SOCKET sClient);
int OpenURL(char *url);
void CloseURL(void);
void main(void)
{
hFile=CreateFile(szFile,GENERIC_WRITE|GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,
NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
int err=OpenURL("mail.ru");
if (err != 0)
printf("Error #%d: %d\n",err, WSAGetLastError());
CloseURL();
CloseHandle(hFile);
}
int OpenURL(char *url) {
char szQuery[2048]; // string for send request to server
char szHlp[2048]; //helper string that contains server name and path on the server
char *pch;
char *http_host;
char *http_path; //path on server
char *none=""; // empty string
int iPort;
struct sockaddr_in server;
struct hostent *host;
if (WSAStartup(MAKEWORD(1,1),&lpWSAData)!=0)
return(1);
// use default port number - 80 if not specified other
strcpy(szHlp,url);
pch = strchr((char*)szHlp,':');
// port not defined in passed URL
if (pch==NULL) {
iPort = 80;
}
// port defined in passed URL
else {
pch[0] = '\0'; // truncate port from URL
iPort = atoi(++pch);
if(iPort == 0) iPort = 80;
}
// separate server name from path on server
pch = strchr((char*)szHlp,'/');
if (pch!=NULL) {
pch[0] = '\0';
http_path=pch+1;
}
else {
http_path=none;
}
http_host=szHlp;
sClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (sClient==INVALID_SOCKET)
return(2);
host = gethostbyname(szHlp);
CopyMemory(&server.sin_addr, host->h_addr_list[0],
host->h_length);
server.sin_family = AF_INET;
server.sin_port = htons(iPort);
// establish a connection with socket 's'
if (connect(sClient, (struct sockaddr *)&server,sizeof(server)) == SOCKET_ERROR)
return(4);
strcpy(szQuery,"GET /");
strcat(szQuery,http_path);
strcat(szQuery," HTTP/1.1\nHost: ");
strcat(szQuery,http_host);
strcat(szQuery,"\nUser-agent: ");
strcat(szQuery,http_user_agent);
strcat(szQuery,"\nAccept: */*\n\n");
printf("%s",szQuery);
// send request
if (!SendString(sClient,szQuery))
return(5);
// receive response
char *str=GetString(sClient);
return(0);
}
//
// routine for send request in 'str' to socket in 's'
//
bool SendString(SOCKET sClient,char* str)
{
int cnt = send(sClient,str,strlen(str),0);
if (cnt == SOCKET_ERROR) return(false); else return(true);
}
//
// routine for receive entire information from 's'
// socket and store it in 'Rec' buffer
//
char* GetString(SOCKET sClient)
{
char *str;
char InBuff[2048];
int cnt;
DWORD dwpoint;
strcpy("",Rec);
while (cnt!=0) {
// clear InBuff - fill 2048 bytes to NULL
memset(&InBuff,0,2048);
// receive a 2048 bytes from 's' sock
cnt = recv (sClient, (char*)&InBuff, sizeof(InBuff),0);
WriteFile(hFile,InBuff, sizeof(InBuff)-1, &dwpoint, NULL);
// append it to main buffer 'Rec'
strcat(Rec,InBuff);
}
return((char*)&Rec);
}
void CloseURL(void) {
WSACleanup();
}