Имя пользователя:
Пароль:
 

Показать сообщение отдельно

Ветеран


Сообщения: 1405
Благодарности: 135

Профиль | Отправить PM | Цитировать


вот очень сырой код с использованием сокетов для работы по протоколу 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();
}

-------
Ehhh.. what's up, doc?..


Отправлено: 21:20, 07-03-2005 | #3