Komunikacja z serwerem API w PHP

0

Witam mam pewien problem. Napisałem program w c++, który ma na zadanie komunikować się z serwerem php.

prosty program napisany w c++:

int connect(){// ta funkcja wykonuje się co 10s
	HINTERNET hNet = 0;
	HINTERNET  hConnect = 0;
	int size;
	int ret;
	char   *head = "Accept: */*\r\n\r\n";
	char recv[2048] = {0};
	char *buffPtr = NULL;
	int bytesAvailable = 0;

        strcpy(sendlink, "www.domena.pl/plik.php?api=client");
	hNet = InternetOpen("NO_NAME", INTERNET_OPEN_TYPE_DIRECT, 0, 0, 0);
	hConnect = InternetOpenUrl ( hNet, sendlink, NULL, 0, INTERNET_FLAG_NO_CACHE_WRITE | INTERNET_FLAG_PRAGMA_NOCACHE | INTERNET_FLAG_RELOAD, 0);
	InternetQueryDataAvailable(hConnect, (LPDWORD)&bytesAvailable, 0, 0);

			do{
			if (!InternetReadFile (hConnect, recv, 2048,  (LPDWORD)&size) ){
				InternetCloseHandle(hNet);
				return -2;
			}

			if (size == 0){// odpowiedz tu odczytuje zwracana wartosc w tym przypadku slowo "good"
				break;  
			}

		}  
		while (1);


}

kod php, który odbiera połączenie:

<?php
	$apiCommands = array( "client" );
	$api = $_GET['api'];
	if (in_array($api, $apiCommands) == true) 
		return "good";
               
?>

Program jest uruchomiony na serwerze dedykowanym i połączenie wykonuje się w pętli co 10s. Problem polega na tym, że po około jednym dniu działania server php nie odczytuje danych od programu - tak jakby php blokowało połączenie. Dlaczego tak się dzieje? php ma jakiś limit połączeń? Dodam, że po utracie połączenia z serwerem php wystarczy wyłączyć i włączyć program i działa dalej. Ma ktoś pomysły co jest nie tak?

0

Zamykasz te polaczenia? Bo na moje skromne oko, wyczerpuja Ci sie uchwyty.

0

w jaki sposób można je zamknąć?

1

The InternetCloseHandle function closes handles of type HINTERNET. Note that handle values are recycled quickly; therefore, if a handle is closed and a new handle is generated immediately, there is a good chance that the new handle has the same value as the handle just closed.

Z tego co widze w kodzie, to zamykasz w przypadku bledu, ale w przypadku gdy size == 0 juz nie. Program opuszcza ta funkcje, uchwyt pozostaje.

0

Dzięki wielkie! taki prosty błąd, a nie zauważyłem...

0

Swoja droga to:

char   *head = "Accept: */*\r\n\r\n";

moim zdaniem jest niezasadne w tym miejscu, proponowalbym skorzystanie z klasy string:

string  head = "Accept: */*\r\n\r\n";

lub oznaczenie modyfikatorem const:

const char   *head = "Accept: */*\r\n\r\n";

W celu unikniecia scrashowania aplikacji w wyniku jakiejkolwiek proby modyfikacji tego ciagu.

1 użytkowników online, w tym zalogowanych: 0, gości: 1