vadimiron
07-03-2005, 20:41
У меня такая проблема - два компа подсоединены к инету через один роутер, он сам автоматически подсоединяется в инет. Но если инет не был в течении нескольких минут нужен (то есть не было ни одного пакета данных отправлено), то роутера отсоединяется от инета и подсоединяется снова только в случае, если ктото например открыл браузер. Это всё не беда, но это подсоединение длиться где то секунд двадцать, вроде недолго, но ждать всё время надоедает, и ктому же отключается аська, если я давно ничегов инете не делал. В настройках роутера постоянную связь сделать нельзя, значит надо обходными путями идти, отсюда возникла мысль:
Нужна маленькая программка, которая бы например каждую минуту отсылала бы какое то определённое количество пакетов (хотя бы общим размером 1 кб) куда нибудь в инет (или что нибудь проверяла, например есть такой то файл на таком то сайте (хостинг у меня в инете есть)) для эмуляции постоянного соединение к инету (то есть роутер будет регистрировать какие то телодвижения и не будет отключаться от инета). Мне не нужна готовая программка, нужен код, дальше я всё сам скомпилирую, или намекните какие функции и/или библиотеки мне могут понадобиться для такой простой программки
намекните какие функции и/или библиотеки мне могут понадобиться для такой простой программки
намекну ;) Вот функции API которые Вам будут нужны:
InternetOpen, InternetOpenURL, InternetCloseHandle, GetTickCount, возможно еще HTTPQueryInfo и InternetReadFile.
вот очень сырой код с использованием сокетов для работы по протоколу 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();
}
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.