Zmienna, która nie przyjmuje wartości

0

Witam,
Piszę aplikację klient/serwer opartą o protokół TCP/IP. Chciałem, żeby mogło połączyć się do serwera wiele klientów. Wszystko działa, ale jest mały problem - nie mogę ustalić nazwy tego kto wysyła wiadomość. Domyślnie ma to robić specjalna komenda "/cmd:name[TWOJE-IMIE]". Serwer otrzymuje tą komendę, wykonuje przypisane jej czynności, ale potem nie może przypisać imienia do zmiennej przechowującej je.

Fragment kodu za to odpowiedzialny:

 
bool CServer::CheckForCmds(char* txt, SClient* k)
{
	if (txt[0] == '/') 
	{
		if (strncmp(txt, "/cmd:name[", 9) == 0) 
		{
			unsigned int len = strlen(txt) - 11;
			if (len > 4) 
			{
				char* c = &txt[10];
				std::ostringstream ss;
				for (unsigned int i = 0; i < len; i++) ss << c[i];
				k->name = ss.str();
				std::cout << "\n>> New name for " << k->sip[0] << "." << k->sip[1] << "." 
                                              << k->sip[2] << "." << k->sip[3] << ": " << k->name;
				if (bLog == true) logFile << "\n>> New name for " << k->sip[0] << "." 
                                                                 << k->sip[1] << "." << k->sip[2] << "." 
                                                                 << k->sip[3] << ": " << k->name;
			}else
			{	
				if (bLog == true) logFile << "![" << k->sip[0] << "." << k->sip[1] << "." << k->sip[2] << "." 
                                                                 << k->sip[3] << "]: " << txt; 
			}
		}
		return (true);
	}else return (false);
}

A tu zapisany do pliku zapis działania programu:


sdl-net test server
ver: May 23 2011

LOG STARTED! Start time: Mon May 23 1853 2011

Loaded settings from 'settings.ini'!
TCP opened on port 7555
listening...
new client connected from 127.0.0.1
Reading data from clients started
New name for 127.0.0.1: Robin92
[]: hej
[]: /cmd:exit
Reading data from clients terminated on demand
Listening stopped on demand
Sockets closed, users deleted

LOG STOPPED! Stop date: Mon May 23 1806 2011

0

Fragment:
char* c = &txt[10];
std::ostringstream ss;
for (unsigned int i = 0; i < len; i++) ss << c[i];
k->name = ss.str();
można zapisać:
k->name=std::string(txt+10,len);
Możliwe że jak zamienisz na to błąd zniknie (nadgorliwy optymalizator). Ale nie liczył bym na to, szukaj w innym miejscu.

0

Zmieniłem i dalej nie działa. Hmm, a może zrobić drugi kontener, ale tylko stringów, w którym będę przechowywał imiona dla poszczególnych klientów (klient i = imie i), itp?

0

Jak masz wpisane przez konstruktor to na pewno masz ten nick. Szukaj błędu w innym miejscu.

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