[C++] Redial / Lägga på & Ringa upp igen - IFRÅN C++!

Elektronikrelaterade (på komponentnivå) frågor och funderingar.
Användarvisningsbild
Jine
Inlägg: 1795
Blev medlem: 21 juli 2004, 20:25:56
Skype: Jim.Nelin
Ort: Trångsund, Stockholm
Kontakt:

Inlägg av Jine »

Hej!

Sååja, nu har man kodat klart!
Färdiga scriptet finns att hitta här nedan, med BRA kommenterad källkod.

Det fungerar såhär att varje 60sekunder så pollar den anslutning, dvs försöker ansluta en socket till www.google.se (ip).
Lyckas detta inte, så antas anslutningen vara "död" och då disconnectar scriptet den, samt ansluter igen.

Detta loopas oändligt antal gånger, till användaren stänger programmet eller använder CTRL+C för att bryta.
Programmet som styr anslutningen till PPP modemet/tre modemet heter "rasdial.exe" och finns med i Vista samt XP.

Färgkodad källkod finns på:

Nedan följer källkoden i plaintext:

Kod: Markera allt

/*
**********************************************
*  Redial program - (C) Jim Nelin 2007-2008
*      Optimazed for "Tre"/3Bredband.
*
*            Version 1.0a
*        Released under GPL License
*      - Please feel free to modify! -
*
*      Notes:
*      You MUST include libwsock32.a in 
*      Dev-C++ or similar!
*
**********************************************
*/

#include <winsock2.h>
#include <iostream>
using namespace std;

// Port - Använder http port 80 som default
int gPort = 80;
// IPt till valfri webserver. Jag valde google.se
char *gIp = "72.14.221.104";
// Framtida variabel för modemnamnet. (Not used atm!)
char *gName = "3USBModem";
// Fake variabel för loopning
int i = 1;

int main()
{
       SOCKET lhSocket;
       SOCKADDR_IN lSockAddr;
       WSADATA wsaData;
       int lConnect;
                
       if(WSAStartup(MAKEWORD(2,0),&wsaData) != 0)
       {
            cout<<"Socket Initialization Error. Program aborted\n";
            // Retunera 0 för att stoppa programmet vid socket fel.
            return 0;
        }
        
    // Loopa föralltid. 
    while(i=1) 
    {     
           // Skapa socket samt testa så den är aktiv.
           lhSocket = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
           if(lhSocket == INVALID_SOCKET)
           {
                cout<<"Invalid Socket "<<GetLastError()<<". Program Aborted\n"<<endl;
                // Retunera 0 för att stoppa programmet vid socket fel.
                return 0;
            }
            
           memset(&lSockAddr,0, sizeof(lSockAddr));
           
           // Sätt socket inställningar, samt port & ip.
           lSockAddr.sin_family = AF_INET;
           lSockAddr.sin_port = htons(gPort);
           lSockAddr.sin_addr.s_addr = inet_addr(gIp);
               // OM det INTE går att ansluta till ip:port...
               if(connect(lhSocket,(SOCKADDR *)&lSockAddr,sizeof(SOCKADDR_IN)) != 0)
               {
                     // Kör extern program för att disconnecta helt.
                     system("rasdial 3USBModem /disconnect");
                     // Låt modemet svalna 2sek
                     Sleep(2000);
                     // Anslut!
                     system("rasdial 3USBModem");
    
               }
               // Clear screen.
               system("cls");
               
               // Vänta 60sek och doit again!
               Sleep(60000);
               
               // Döda socketen.
               closesocket(lhSocket);
    } // LOOP!

}

Scriptet funkar att kompilera direkt i Dev-C++, dock måste man inkludera libwsock32.a i projektinställningarna.

Nedan följer hela projektmappen för Dev-C++ (Ink projekt filer)
http://dump.jine.se/index.php?folder=cmVkaWFs

Hoppas nån mer än jag har nytta för programmet iaf =)

mvh Jim
Användarvisningsbild
speakman
Inlägg: 4838
Blev medlem: 18 augusti 2004, 23:03:32
Ort: Ånge

Inlägg av speakman »

Det liknar ett vanligt modem, och då blir jag än mer frågande hur antalet anslutningar har med saken att göra.
Att lasten på linan är av betydelse känns som en mer lättsmält anledning.
Användarvisningsbild
RasmusB
Inlägg: 1006
Blev medlem: 24 augusti 2006, 23:32:13
Ort: Södertälje

Inlägg av RasmusB »

... med tanke på scenariot får man väl ungefär samma effekt? Begränsar du antalet anslutningar så får du färre klienter att tanka från, och belastningen på modemet sjunker? Problemet var ju trots allt när han tankade via bittorrent
Användarvisningsbild
Jine
Inlägg: 1795
Blev medlem: 21 juli 2004, 20:25:56
Skype: Jim.Nelin
Ort: Trångsund, Stockholm
Kontakt:

Inlägg av Jine »

Hej!

Vet inte om jag skrev det förut, men att tanka via HTTP/FTP/MSN/WHATEVER går jättebra och modemet maxar ur i runt 3,2mbit. HELT utan problem eller avbrått...

Men det är just när det är hundratals anslutningar som modemet krachar.
Men som sakt, problemet tycks vara löst. Man märker inte ens längre om modemet kopplar ner! Ställde dock in sleeptimen till 10sek istället för 60sek.

Enda man märker är att internet blir lite segare i några sekunder. Men funkar perfekt annars =)


Mvh Jim
Användarvisningsbild
speakman
Inlägg: 4838
Blev medlem: 18 augusti 2004, 23:03:32
Ort: Ånge

Inlägg av speakman »

Det är ju bra, men jag brukar sällan nöja mig med att det bara fungerar. Vill gärna veta varför också. :)
Och ett modem har ingen kännedom om antalet anslutningar, därför förvånar din teori.
Skriv svar