Smieci z recv()

0

Napisalem sobie program do komunikacji sieciowej i moj problem polega tym ze recv() zwraca czasem dane z poprzedniej parti danych. Socket jest usatwiony w tryb nieblokowalny.

string NET::recive(void)
{
	int max_size=1000,size,a=0,b=0;
	string sBuffor;
	char *cBufor;
	sBuffor.clear();
	do
	{
		do
		{
			cBufor=new char [max_size+1]; 
			memset (cBufor,0,sizeof (cBufor));
			recv (Polaczenie,cBufor,max_size,0);
			size=strlen(cBufor);
			sBuffor+=cBufor;
			delete [] cBufor;
			if (!(size>0)) b=0; else {b++; Sleep(500);}
		}       
		while(size>0);
		a++;
		Sleep(500);
		if (*debug==true)cout<<"Sleep ...."<<a<<"buffor "<<sBuffor.length()<<endl;
	}
	while((sBuffor.length()==0)&&(a<=40));
	//while(strlen(cBufor)>max_size-1);
	return sBuffor;
}
0

Socket jest usatwiony w tryb nieblokowalny.

Ustaw na tryb blokujący, bo i tak to, co chcesz zrobić i sposób w jaki to robisz, jest blokujące.

int max_size=1000;  //<--- (1)
	
(...)	
	
do
{
	do
	{
		cBufor = new char [max_size+1]; //<--- (1)
			
		memset (cBufor,0,sizeof (cBufor));  //<--- (2)
		recv (Polaczenie,cBufor,max_size,0); //<--- (4)
		size = strlen(cBufor);	//<--- (3)
		sBuffor += cBufor;	//<--- (3)
			
		delete [] cBufor;  //<--- (1)
	}       
	while(size>0);

	(...)
}
while((sBuffor.length()==0)&&(a<=40));
  1. a o tablicach innych niż dynamicznych słyszał?
  2. cBufor jest wskaźnikiem, zatem co zwróci sizeof?
  3. skąd ta pewność, że recv zawsze zwróci c-stringa, poprawnie zakończonego null-terminatorem?
  4. nie sprawdzasz co zwraca recv - błąd.

//q: ps. do autora wątku: recive() -> receive()

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