stringstream über socket versenden

OinK2K

Grünschnabel
Hi,
ich habe folgendes Problem, ich muss über eine Socketverbindung Daten versenden, dabei hat der Empfänger nur einen receive buffer der folgendermassen definert ist: buff[512].
Nun bin ich in der Situation, wo ich Daten über [512] zeichen versenden muss.. ich wollte das nun folgendermassen über einen stringstream lösen.

PHP:
BOOL SendEx(SOCKET sClient, CString stData)
{
	int nRet;
	char sendBuff[SRV_PSIZE];
	CString stTmp = stData;
	
	if(stTmp.IsEmpty())
		return false;

	int sizeOfBuffer = stTmp.GetLength();

	if(sizeOfBuffer <= SRV_PSIZE)
	{
		strcpy_s(sendBuff, SRV_PSIZE, stTmp.GetBuffer());
		nRet = send(sClient, sendBuff, sizeof(sendBuff), 0);
		if(nRet == 0 || nRet == SOCKET_ERROR)		
			return false;	
	}
	else
	{
		stringstream stream( stTmp.GetBuffer(), sizeof( stTmp ) );
	
		while(!stream.eof())
		{
			nRet = send(sClient, (char*)&stream, SRV_PSIZE, 0);
			if(nRet == 0 || nRet == SOCKET_ERROR)		
				return false;		
		}
	}
	return true;
}

Ich hatte die Hoffnung über diese Methode max. 512 Zeichen große "Packete" an den Client senden zu können. Nur leider kommen nur Sonfderzeichen ala "8 à Ð =Ð=¼D¬ " beim Client an...
Hat jemand ne Idee wie ich das ganze richtig mache oder eleganter lösen kann ?¿?
 
Hi.

Der stringstream bringt dich nicht weiter (vor allen Dingen nicht wenn du ihn so benutzt). Außerdem ist es völlig egal wie der Buffer beim Empfänger definiert ist; die Buffer müssen nicht gleich sein.

C++:
BOOL SendEx(SOCKET sClient, CString stData)
{ 
  int sentBytes = 0, nRet;

  while ((nRet = send (sClient, stData.GetBuffer() + sentBytes, 
                   stData.GetLength() - sentBytes, 0)) != SOCKET_ERROR) {
    if (nRet == 0) return true;
    sentBytes += nRet;
  }
  return false;
}
 
Danke dir für deine Hilfe. Mit dieser Methode kann ich zwar einen String beliebiger größe versenden, nur habe ich jetzt natürlich das problem, wie ich den auf der clientseite mit recv annehmen kann. Bin absoluter Anfänger was c++/socket programmierung angeht, also wunder dich bitte nich über meine naiv doofe fragestellung.
Auf der Clientseite habe ich bisher folgendermassen daten entgegen genommen...
PHP:
	char buff[512];
	int z;

	while(bConnected)
	{
		z = recv(conn, buff, 512, 0);
		if(z != SOCKET_ERROR && z != 0)
		{
                  ...........
 
Also im Prinzip muß man einfach den String wieder zusammenbauen:
C++:
std::string res;

int bytesRead = 0, nRet;
char buf[512];

while ((nRet = recv(conn, buf, sizeof(buf), 0)) != SOCKET_ERROR) {
  if (nRet == 0) return res;

  res.append(buf, buf + nRet);
}
Ich hab hier mal einen std::string genommen. Mit einem CString sollte es ähnlich gehen - den benutz ich aber nie.

Gruß
 

Neue Beiträge

Zurück