HTTP POST/Internet blockiert



  • Hallo,
    ich schreibe ein kleines Programm mit dem man in einer Community Nachrichten verschicken kann. Das funktioniert auch, allerdings gibt es eine Art Sperre, die nur ein Senden der Nachricht alle 5 Sekunden erlaubt. Diese Sperre kann man allerdings umgehen, indem man sich vor jedem POST (um die Nachricht zu verschicken) neu einloggt. Nun gibt es aber ein Problem, nach einigen Usern stoppt das Programm einfach und es wird nichts mehr gesendet, noch komischer ist, dass mein kompletter Traffic geblockt zu sein scheint, denn ich kann weder Seiten im Browser aufrufen, noch irgendwelche anderen Internetaktivitäten ausführen, solange das Programm still steht.

    Ich habe schon mit "Connection: close" herumexperimentiert, allerdings ergab das kaum eine Verbesserung.

    Der Code ist nichts besonderes, ich setze nur den Request zusammen und sende ihn. Es klappt wie gesagt auch, die Nachrichten kommen an, aber ich kann mir nicht erklären warum es einfach stehen bleibt.



  • Hallo,

    dann zeig doch mal etwas Code. Was bedeutet es bleibt stehen?
    "Keine Rückmeldung" oder wartet es einfach so lange auf die
    Antwort vom Ziel? Das ist so alles ziemlich vage einzuschätzen,
    was da womöglich passiert, oder eben auch nicht passiert...



  • Ohne Code kann man nicht viel sagen,
    arbeitest Du mit oder ohne Fset?

    greetz



  • u_long dns(const char *host){ 
    
    	struct hostent *hp; 
    	u_long host_ip; 
    
    	host_ip = inet_addr(host); 
    	if(host_ip == INADDR_NONE){ 
    		hp = gethostbyname(host); 
    		if(!hp){ 
    			return 0; 
    		}else{ 
    			host_ip = *(u_long *)hp->h_addr; 
    		} 
    	} 
    	return host_ip; 
    }
    
    string HTTPRequest(const char* server, int port, string request)
    {
    	WSADATA w; 
    	int res = WSAStartup(MAKEWORD(2,0), &w);
    
    	int Socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 
    
    	u_long ip = dns(server); 
    
    	SOCKADDR_IN service; 
    	service.sin_family = AF_INET;
    	service.sin_port = htons(port);
    	service.sin_addr.s_addr = ip;
    
    	res = connect(Socket, (SOCKADDR *)(&service), sizeof(service));
    
    	res = send(Socket, request.c_str(), request.length(), 0);
    	char buffer[1024] = "";
    	res = recv(Socket, buffer, sizeof(buffer) - 1, 0);
    
    	buffer[res] = '\0';
    	WSACleanup();
    
    	return buffer;      
    }
    

    So wird der Request gesendet.

    Es läuft jetzt etwas länger, wenn ich beim Login und beim eigentlich Nachrichten - Versenden Connection: close angebe, bleibt aber dennoch stehen.

    Stehen bleiben im Sinne von der Server antwortet nicht mehr, obwohl der Request richtig ist. Starte ich das Programm neu, kann ich aber wieder die selbe Menge an Nachrichten hintereinander versenden. Kann es sein, dass manche Server nach einer gewissen Anzahl an Requests ein Timeout erzwingen? Am Account kann es nicht liegen, ich logge mich ja immer wieder neu ein, alle Cookies werden neu geholt.

    Verzeihung, was ist FSet?



  • Du verbindest Dich immer wieder neu mit dem Server obwohl Die verbindung noch steht. D.h. rufe Connect nur dann auf wenn Du noch keine Verbindung zu dem Server hast.
    Es kann sein das der HTTP Server im header verlangt das die verbindung geschlossen wird, nur dann die verbindung auch schließen.

    http://www.c-worker.ch/tuts.php
    oder von maverick:
    http://www.pc-adviser.de/socket_programmierung.html

    Beides gute Tutorial und erklärt was das select() macht und was Fset's sind.

    greetz


Anmelden zum Antworten