Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (GNU/Linux, *NIX, *BSD und Co) » C++ Socket Programmierung

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
01.04.2004, 14:13 Uhr
Holger1976



Hallo mal wieder.
Ich hab meinen Socket in C++ unter Linux jetzt soweit zum laufen gebracht, das er mir mit der get bzw. recv Anweisung Daten aus einer Url in eine Datei auf meiner Festplatte speichert.
Allerdings bricht der Dowload im nach ca. 1/4 ab. Woran kann das liegt. So wie es aussiehst gibt der Server 0 bei recv zurück obwohl dir Datei noch nicht komplett runtergeladen ist.
Mein Code sieht so aus:

C++:
ofstream AusgabeDatei(Url);

    do
    {
        Count = recv( Sock, Buffer, sizeof(Buffer), 0);
                   if (Count > 0)
            {
                AusgabeDatei << Buffer;
                memset(Buffer, 0, sizeof(Buffer));
            }
        }
    while (Count > 0);

Kann mir jemand helfen? Wäre toll!!!


Ciao,
Holger


Bearbeitung von typecast:
cpp-Tags gesetzt

Dieser Post wurde am 01.04.2004 um 15:10 Uhr von typecast editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
01.04.2004, 14:38 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


mach es lieber so:


C++:
ofstream AusgabeDatei(Url);
char Buffer[8192];
do
{
   Count = recv( Sock, Buffer, 8192, 0); // sizeof(Buffer) nicht immer gleich Arraygröße!
   Buffer[Count] = '\0'; // Buffer terminieren!
   if (Count > 0)
   {
      AusgabeDatei << Buffer;
      memset(Buffer, 0, sizeof(Buffer));
   }
}
while (Count > 0);


--
class God : public ChuckNorris { };

Dieser Post wurde am 01.04.2004 um 14:38 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
01.04.2004, 15:18 Uhr
Holger1976



Hm danke, aber das Problem bleibt bestehen. Das Programm lädt von einer z.b. 650 kb grossen Daten nur 132,8 runter. Von einer 6,5 MB grossen Datei komischerweisse 1,3 MB.
Hier mal das ganze Programm/Klasse:

C++:
class Socket
{
public:

int      Sock;
char     Buffer[8192];
int    Count;
char     Url[100];
char *Host;
char *Path;
unsigned long Addr;
signed int Bytes_Sent;

Socket(void)        //Konstruktor
{    
    Sock  = 0;
    Count = 0;
    Addr = 0;
    Bytes_Sent = 0;                                                      
    memset(Buffer, 0, sizeof (Buffer));                              
    memset(Url, 0, sizeof (Url));                                        

}
~Socket(void)         //Destruktor
{
    Sock  = 0;
    Count = 0;
    Addr = 0;
    Bytes_Sent = 0;
    memset(Buffer, 0, sizeof (Buffer));
    memset(Url, 0, sizeof (Url));
}

float Socket_Creation()
{
    struct sockaddr_in server;
    struct hostent* Host_Info = NULL;

    //Url eingeben die man aufrufen will
    cout << "Bitte die Url eingeben: (z.b.www.yahoo.de): " ;
    cin >> Url;

    //Eingebene Url in Host und Pfad splitten
    Host = strtok(Url,"/");
    Path = strtok(0," ");
    cout << Host;
    cout << Path;
    
    // Erzeuge das Socket
    Sock = socket( PF_INET, SOCK_STREAM, 0);
    if (Sock < 0)
    {
        cerr << "Kann Socket nicht erstellen";
        exit(1);
    }

    //  Erzeuge die Socketadresse des Servers. Sie besteht aus Typ,
    //  IP-Adresse und Portnummer
    
    //  Url ist eine numerische IP-Adresse
    memset(&server, 0, sizeof (server));
    if    ((Addr = inet_addr(Url)) != INADDR_NONE)
    memcpy(&server.sin_addr, Host_Info->h_addr, Host_Info->h_length);
    
    //   Wandle den Servernamen in eine IP-Adresse um
    else
        {    Host_Info = gethostbyname(Url);
            cout << (int)Host_Info;
            
            if   (NULL == Host_Info)
            {
                cout << "Unbekannter Server: "<< Url;
                exit(1);
            }
            
            else memcpy( (char *)&server.sin_addr, Host_Info->h_addr, Host_Info->h_length);
        }

    //Portnummer des Dienstes ermitteln
    //Nornmalerweise 80, aber sicher ist sicher :-)
    servent* serviceinfo = getservbyname ("http", "tcp");
    server.sin_port = serviceinfo->s_port;
    server.sin_family = AF_INET;

    // Baue die Verbindung zum Server auf
    if (connect( Sock, (struct sockaddr*)&server, sizeof( server)) < 0)
    {
        cerr << "Kann Verbindung zum Server nicht aufbauen";
        exit(1);
    }


    // Erzeuge und sende den http GET request
    //cout << "Bitte die Seite eingeben die du aufrufen willst: " ;cin >> Path;
    sprintf( Buffer, "GET /%s HTTP/1.0\nHost: %s\n\n",Path, Host);
    Bytes_Sent = send (Sock, Buffer, strlen (Buffer), 0);

    //Überprüfen ob send Anfrage
    //angekommen ist
    if (Bytes_Sent == -1)
    {
        cerr << "Fehler bei Sendeanfrage";
        exit (1);
    }

    // Hole die Serverantwort und gib sie auf Datei aus
    ofstream AusgabeDatei(Url);
    int ControlCounter = 0;

    do
    {
        Count = recv( Sock, Buffer, 8192, 0);
        Buffer[Count] = '\0';
        if (Count > 0)
            {
                AusgabeDatei << Buffer;
                memset(Buffer, 0, sizeof(Buffer));
            }
        }
    while (Count > 0);

    // Schließe Verbindung und Socket
    cout << "Download abgeschlossen :o)";
    closesocket(Sock);
    return Count;
        
    }
};




Bearbeitung von typecast:
cpp-Tags gesetzt

Dieser Post wurde am 01.04.2004 um 15:27 Uhr von typecast editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
01.04.2004, 15:32 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


hast du schonmal verschiedene Server ausprobiert? Vielleicht liegt es ja an dem Server?

Es kann aber auch daran liegen das er zwar alles empfängt, dies aber nicht in die Datei schreibt, da

1. den Stream nicht flushst
2. die Datei nicht schliesst und dadurch auch den Stream nicht flushst
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
01.04.2004, 16:33 Uhr
Holger1976



Datei schliessen ist klar.
Aber was meinst du mit Stream flushen?
Ich habe schon einige Server probiert. Daran kann es nicht liegen.
Es gibt doch noch sowas wie einen read Befehl oder?
mfg,
Holger

Dieser Post wurde am 01.04.2004 um 16:42 Uhr von Holger1976 editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
01.04.2004, 17:00 Uhr
typecast
aka loddab
(Operator)



C++:
Count = read(Sock, Buffer, 8192);


Sollte aber das gleiche Ergebnis liefern. Die man-page von recv sagt zwar, dass es passieren kann, dass ein Teil der Nachricht verworfen werden kann, allerdings sollte das nur bei UDP-Sockets passieren. Aber probier es mal aus und berichte was passiert ist.
--
All parts should go together without forcing. ... By all means, do not use a hammer. (IBM maintenance manual, 1925)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
01.04.2004, 17:47 Uhr
Holger1976



Leider liefert der read Befehl wirklich das gleich Ergebnis. Interressant dabei ist, das immer ca die gleicher Prozentzahl der Gesamtdatei downgeloadet wird.
1,3 MB von 6,5 MB
58,5 kb von 295 kb
132,8 kb von 603 kb
47,8 kb von 196 kb

Seltsam seltsam

Dieser Post wurde am 01.04.2004 um 17:48 Uhr von Holger1976 editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
01.04.2004, 20:33 Uhr
Holger1976



Wer kennt ich noch mit dem Thema aus???
Bin für jede Hilfe dankbar!!!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
04.04.2004, 17:14 Uhr
Holger1976



Hey bitte helft mir!!!
Falls jemandn noch eine Idee hat, bitte schreiben!!
Danke!!!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
04.04.2004, 18:20 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


Hi, schick mir mal das Projekt (ohne Binaries) an hilfe at flo-soft.de. Dann schau ichs mir mal an. Am Dienstag fahr ich in Urlaub, aber wenn du es mir heute noch schickst, kann ichs mir noch anschauen
--
class God : public ChuckNorris { };

Dieser Post wurde am 04.04.2004 um 18:20 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (GNU/Linux, *NIX, *BSD und Co) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: