Komunikacja z serwerem API w PHP

Komunikacja z serwerem API w PHP
SX
  • Rejestracja:ponad 14 lat
  • Ostatnio:prawie 12 lat
  • Postów:7
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++:

Kopiuj
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:

Kopiuj
<?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?

edytowany 1x, ostatnio: samone-x
n0name_l
  • Rejestracja:ponad 12 lat
  • Ostatnio:prawie 5 lat
  • Postów:2412
0

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

edytowany 1x, ostatnio: n0name_l
SX
  • Rejestracja:ponad 14 lat
  • Ostatnio:prawie 12 lat
  • Postów:7
0

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

n0name_l
  • Rejestracja:ponad 12 lat
  • Ostatnio:prawie 5 lat
  • Postów:2412
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.

SX
  • Rejestracja:ponad 14 lat
  • Ostatnio:prawie 12 lat
  • Postów:7
0

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

n0name_l
  • Rejestracja:ponad 12 lat
  • Ostatnio:prawie 5 lat
  • Postów:2412
0

Swoja droga to:

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

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

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

lub oznaczenie modyfikatorem const:

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

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

edytowany 1x, ostatnio: n0name_l
Zobacz pozostałe 2 komentarze
n0name_l
Jesli sie robi takie cuda wianki, to trzeba wiedziec co sie robi i w najgorszym wypadku spowodowac blad kompilacji. A nie segfaulta.
Demonical Monk
Ale to przejdzie bez żadnych błędów, w pełni poprawna deklaracja :|
n0name_l
Jezykowo poprawna, w kodzie natomiast kompletnie bez sensu... 1) to C++ wiec w ogole tam tego nie powinno byc 2) z reguly robi sie wszystko, zeby ograniczyc ryzyko bledu, a tu ono jest dosc duze, wystarczy jakakolwiek modyfikacja takiego kwiatka i leci crash z miejsca, a taka modyfikacja wcale nie musi byc jawna.
n0name_l
Moze zle sie wyrazilem, poprawilem post.
Demonical Monk
Przecież o to chodzi w używaniu stałych, żeby jakakolwiek próba modyfikacji spowodowała wyłożenie się? To i tak jest potem sklejane z odpowiedzią.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.