PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : verbindung bricht ab?


Dyner
31.08.2005, 20:56
Hallo,
nachdem ich die Probleme mit der anforderung der txt datei mit fremder hilfe lösen konnte, stehe ich nun vor dem nächsten problem:

ich möchte eine textdatei die auf einem server liegt regelmässig in mein programm einlesen können.
wenn ich die datei nun öfters einlesen will, funktioniert dies ein paarmal hintereinander bis send() -1 zurückliefert


#include <iostream>
#include <windows.h>
#include <conio.h>
#include <string>
using namespace std;
#pragma comment (lib, "WSOCK32.lib");

int main()
{
WSADATA wsaData;
WSAStartup (MAKEWORD(1, 1), &wsaData);

int o_sock;
o_sock = socket(AF_INET, SOCK_STREAM, 0);

sockaddr_in serv_addr;
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(80);
serv_addr.sin_addr.s_addr = inet_addr("213.202.241.46"); //Response vom Dns : Name: server1.funpic.de Adress: 213.202.241.46 Aliases: ansgarphp.an.funpic.de

int o_cnnct;
while(1)
{
o_cnnct = connect(o_sock, (sockaddr *) &serv_addr ,sizeof(sockaddr));
if (o_cnnct != -1)
{
cout << "connected" << endl;
break;
}
if (o_cnnct == -1)
{
cout << endl <<"fehler: connect == -1" << endl;
}
}
// Connection: keep-alive
char *tosend = "GET /test.txt HTTP/1.1\r\nHost: ansgarphp.an.funpic.de\r\nConnection: close\r\n\r\n"; //"GET /test.txt HTTP/1.1\r\nHost: ansgarphp.an.funpic.de\r\n\r\n"
int size = strlen(tosend);
size++;

char buf[5001];
int g;
string ausgabe;

while(1)
{
while(1)
{
int s = send(o_sock, tosend, size,0);
if(s == size) { break;}
if(s == -1)
{
cout << WSAGetLastError() << " " ;
}
s = 0;
getch();
}
cout << "sended" << endl;

g = recv(o_sock,buf,5000,0); //Daten vom Server empfangen
buf[g]='\0';

for(int loop = 0; loop < 5001; loop++)
{
ausgabe = ausgabe + buf[loop];
buf[loop] = NULL;
}
cout << ausgabe;
getch();
}

WSACleanup();
getch ();
return 0;
}





bestenfalls klappt es 13mal kurz hintereinander .
von getlasterror wird 10053 zurückgeliefert,

ich hoffe es hat jemand eine idee =)

mfg


Torsten Arlt
01.09.2005, 07:49
HTTP ist ein verbindungsloses Protokoll. Vielleicht solltest Du die Verbindung bei jeder Anforderung erneut aufbauen.

Denn selbst, wenn er öfter durch die Schleifen laufen würde, kommst Du bald ans "Ende Deiner Kräfte".

Das while(1) ist ohnehin eine sehr unsaubere Art der Programmierung, da einerseits das Schleifen-Abbruch-Kriterium ausser Kraft gesetzt ist, und der Code dadurch unlesbar wird, die breaks; zu suchen. Und andererseits besteht die Gefahr, gar keinen break oder einen nur unzurechenden break; zu programmieren. Deine äussere Schleife zB. hat kein Abbruch - und damit würde Dir entweder die Ressourcen ausgehen - eher aber das Programm ewig laufen und nicht mehr steuerbar sein!

Tipp: Erzeuge Dir eine Funktion "readText()" o.ä., die einmal die komplette Verbindung aufbaut und die Datei einliest. Dann erzeugst Du Dir einen Timer, der zyklisch und innerhalb eines bestimmten Zeitintervalls diese Funktion aufruft.
Auf diese Art und Weise sollte es prima klappen - und das Programm bleibt auch weiterhin steuerbar!

Dyner
01.09.2005, 17:32
ich liebe es wenn alles so funktioniert wie ich es mir vorgestellt habe :)

thx dafür :cool: