[C++] Gadu-Gadu, lista kontaktów

Czepek221

Użytkownik
Dołączył
Maj 18, 2010
Posty
26
[C++] Gadu-Gadu, lista kontaktów oraz ANSI -> UTF-16 -> UTF-8

Witam, mam dość dziwny problem z listą kontaktów, iż gdy wysyłam pakiet z "prośbą" o otrzymanie listy kontaktów to ją otrzymuję, lecz nie pełną.

Oczywiście mam funkcję, która odbiera wszystkie dane.

PHP:
void Protocol::receivePackets()
{
	if(!isConnected())
		return;

	gg_header recvPacket;
	if(trueCon->recvFrom((char*)&recvPacket, sizeof(gg_header)) != SOCKET_ERROR)
	{
		switch(recvPacket.type)
		{
			case GG_USERLIST_REPLY:
			{
				addConsoleMsg(">> Otrzymano pakiet, który wysyła listę kontaktów (%i) !", recvPacket.length);

				gg_userlist_reply reply;
				int size = trueCon->recvAll((char*)&reply, recvPacket.length);
				addConsoleMsg(">> Size: %i", size);
				std::string list;
				switch(reply.type)
				{
					case GG_USERLIST_GET_MORE_REPLY: //begin
						addConsoleMsg(">> Otrzymano początek listy konatków");
						list += reply.request;
						break;

					case GG_USERLIST_GET_REPLY: //end
						addConsoleMsg(">> Otrzymano koniec listy konatków");
						list += reply.request;
						break;

					default:
						//addConsoleMsg(">> Otrzymano coś innego! 0x%X", reply.type);
						break;
				}

				FILE* file = fopen("Kontakty.txt", "w+");
				fprintf(file, "%s", reply.request);
				fclose(file);
				break;
			}

			default:
				//addConsoleMsg(">> Odebrano nieznany pakiet! (0x%X)", recvPacket.type);
				break;
		}
	}
}

PHP:
int Connection::recvFrom(char* recvBuffer, int recvBufferLength)
{
	return recv(sock, recvBuffer, recvBufferLength, 0);
}

int Connection::recvAll(char* recvBuffer, int recvBufferLength)
{
	std::string tempBuffer;
	int tempSize;
	int fullSize = 0;
	do
	{
		tempSize = recvFrom(recvBuffer, recvBufferLength);
		fullSize += tempSize;
		tempBuffer += recvBuffer;
	}while(fullSize > recvBufferLength);
	memcpy(recvBuffer, tempBuffer.c_str(), tempBuffer.size());
	return tempBuffer.size();
}

Od razu mówię, że odbieranie pakietów działa normalnie.

P.S.
Po około 10 próbach wysyłania próśb otrzymuję pełną listę.
Kod:
>> Otrzymano pakiet, który wysyła listę kontaktów (137) !
>> Size: 129
>> Otrzymano pakiet, który wysyła listę kontaktów (137) !
>> Size: 137
>> Otrzymano koniec listy konatków

Korzystam z protokołu 8.

Jakieś pomysły?


Ktoś mógł by pomóc również skonwertować tekst z ANSI do UTF-16, a następnie do UTF-8?


Pozdrawiam, Czepek!
 
Ostatnia edycja:

tobix10

Użytkownik
Dołączył
Luty 25, 2009
Posty
65
Myślałeś może na pobieraniu danych, aż nadejdzie jakiś znacznik końca(chyba jest jakiś w protokole gg, żeby oznaczyć koniec przesyłania danych albo chociaż sprawdzać wielkość odebranych danych), czyli pobierając w pętli i dopisując do jakiegoś zbiorczego elementu. Dane mogą przychodzić częściami.
Chociaż nie czytałem protokołu gg, dlatego mogę źle mówić, ale warto wziąć to pod uwagę.
 
Do góry Bottom