Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   нужен с++ код для посылки пакета данных в инет (http://forum.oszone.net/showthread.php?t=46389)

vadimiron 07-03-2005 20:41 304381

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

Savant 07-03-2005 21:16 304390

Цитата:

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

mrcnn 07-03-2005 21:20 304391

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



Время: 05:11.

Время: 05:11.
© OSzone.net 2001-