Войти

Показать полную графическую версию : нужен с++ код для посылки пакета данных в инет


vadimiron
07-03-2005, 20:41
У меня такая проблема - два компа подсоединены к инету через один роутер, он сам автоматически подсоединяется в инет. Но если инет не был в течении нескольких минут нужен (то есть не было ни одного пакета данных отправлено), то роутера отсоединяется от инета и подсоединяется снова только в случае, если ктото например открыл браузер. Это всё не беда, но это подсоединение длиться где то секунд двадцать, вроде недолго, но ждать всё время надоедает, и ктому же отключается аська, если я давно ничегов инете не делал. В настройках роутера постоянную связь сделать нельзя, значит надо обходными путями идти, отсюда возникла мысль:
Нужна маленькая программка, которая бы например каждую минуту отсылала бы какое то определённое количество пакетов (хотя бы общим размером 1 кб) куда нибудь в инет (или что нибудь проверяла, например есть такой то файл на таком то сайте (хостинг у меня в инете есть)) для эмуляции постоянного соединение к инету (то есть роутер будет регистрировать какие то телодвижения и не будет отключаться от инета). Мне не нужна готовая программка, нужен код, дальше я всё сам скомпилирую, или намекните какие функции и/или библиотеки мне могут понадобиться для такой простой программки

Savant
07-03-2005, 21:16
намекните какие функции и/или библиотеки мне могут понадобиться для такой простой программки
намекну ;) Вот функции API которые Вам будут нужны:
InternetOpen, InternetOpenURL, InternetCloseHandle, GetTickCount, возможно еще HTTPQueryInfo и InternetReadFile.

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




© OSzone.net 2001-2012