Tekstowe protokoły komunikacji, Winsock

0

Witam
Jeśli ktoś znajdzie czas to proszę o podpowiedź.

Staram się napisać prosty program bazujący na TCP który poprzez tekstowy (a nie binarny) protokół komunikacji spełnia funkcję serwera obliczającego sumę dostarczonych przez klienta liczb. Program testuje wykorzystując usługę telnet.

po nawiązaniu sesji wysyłam informacje potwierdzającą:

 
	char tekst[] = "Witaj polaczenie zostalo nawiazane...";
	send(gniazdoAccept, tekst, strlen(tekst), NULL);

Następnie w pętli sprawdzam dane wysyłane przez klienta stosując mechanizm gniazd nieblokujących

while(true)
	{
		char polecenie[256] = "";
		if(recv(gniazdoAccept, polecenie, sizeof(polecenie), NULL))
		{
			value = polecenie[0];
			znaki.push_back(value);

			if(polecenie[1] == 10)
			{
				
				for(int i = 0; i<znaki.size(); ++i)
				{
					polecenie[i] = znaki.at(i);
				}

				znaki.clear();
			}
			
		}else
		{
			printf("Brak polaczenia!\n");
			_getch();
		}
	}

Znaki które otrzymuje od klienta przechowuję w strukturze danych vector. Gdy natrafię na znak 10 czyli nową linie wrzucam polecenie do char'a.

Jak widać posiadam już całe polecenie np. SUMA 20 30 40 50 i teraz pojawia się problem ponieważ nie mogę wiedzieć ile liczb zostanie zsumowanych.
przy użyciu sscanf jestem w stanie wyłuskać z chara komendę SUMA jednak nie jestem w stanie poruszać się po łańcuchu znaków jak po pliku txt (gdzie po prostu w pętli pobieram liczby aż do końca pliku). I teraz moje pytanie: W jaki sposób wyłuskać z takiego polecenia poszczególne liczby?

btw: wiem iż mój kod może być wyjątkowo nieelegancki dlatego proszę zaawansowanych programistów sieciowych o podpowiedź jak w elegancki sposób obsługiwać polecenia dostarczane do serwera podczas komunikacji wykorzystującej protokoły tekstowe.

0

Zamiast tablicy char możesz użyć std::string, jak jednak ma być tablica char to na jej końcu dodaj znak '\0'.
Zakładając, że masz już to polecenie w stringu, czy jako c-string to sumowanie może wyglądać tak:

string akcja;
int suma = 0;
int skladnik;
istringstream iss(polecenie);
iss >> akcja;
if(akcja == "SUMA")
{
    while(iss >> skladnik)
        suma += skladnik;

    cout << "Suma wynosi" << suma << endl;
}

(i/o)stringstream to bardzo fajna klasa, radzę się z nią zapoznać

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