[MSVC++ 6.0] CAsyncSocket Daten Senden, Empfangen & Reagieren

So, morgen Jungs, mal wieder ne Frage betreff CAsyncSocket, bzw. allgemein der Socketkommunikation.

Serverseitig:
Code:
void DSocket::SendString(CString strBuffer)
{
	char pBuf[4];
	::_itoa(strBuffer.GetLength(),pBuf, 10);
	if(this->Send(pBuf, 4) == SOCKET_ERROR)
	{
		this->ShowErr();
	}
	this->d_filLog.WriteLn(1,"Größe gesendet\r\n");
	if(this->Send(strBuffer, strBuffer.GetLength()) == SOCKET_ERROR)
	{
		this->ShowErr();
	}	
	this->d_filLog.WriteLn(1,"Antwort gesendet\r\n");
}

Code:
else if(strIdentifier.CompareNoCase(_T("GTDVCP")) == 0) //GetDeviceCaps
{
CString strSendBuffer;
	int iIndex = atol(strBuffer);

	strSendBuffer.Format(_T("%d"), this->d_hpPrint.GetDeviceCaps(iIndex)); //Width, in millimeters, of the physical screen.
	this->SendString(strSendBuffer);
}

Code:
			else if(strIdentifier.CompareNoCase(_T("DOPRNT")) == 0)
			{
				CString strSendBuffer;
				BOOL bBeginNewPage = TRUE;

				if(strBuffer.CompareNoCase(_T("false")) == 0)
				{
					bBeginNewPage = FALSE;
				}
				this->d_hpPrint.Print(bBeginNewPage);
				strSendBuffer.Format(_T("OK")); //Width, in millimeters, of the physical screen.
				this->SendString(strSendBuffer);
			}

Clientseitig:
Code:
void HDocumentPrint::SendString(CString strBuffer, BOOL bSendNow) //bSendNow standard: FALSE
{
	char *pBuf = new char[4];
	BOOL bSend = FALSE;

	itoa(strBuffer.GetLength(),pBuf, 10);
	this->d_strContainer += pBuf;
	this->d_strContainer += strBuffer;

	if( this->d_strContainer.GetLength() >= 800 || bSendNow) // 02.06.2009
	{
		bSend = TRUE;
	}
	if(bSend)
	{
		itoa(this->d_strContainer.GetLength(),pBuf, 10);
		if(this->d_sSender.Send(pBuf, 4) == SOCKET_ERROR)
		{
			this->d_sSender.ShowErr();
			this->d_sSender.Close();
		}
		if(this->d_sSender.Send(this->d_strContainer, this->d_strContainer.GetLength()) == SOCKET_ERROR)
		{
			this->d_sSender.ShowErr();
			this->d_sSender.Close();//*/
		}	
		this->d_strContainer.Empty();
	}
	delete pBuf; 
}

Code:
int HDocumentPrint::GetDeviceCaps(int iIndex)
{
	int intRealWidth;

	CString strBuffer;
	DWORD iTransferSize = 0;
	int iLen = -1, iRec = 0;
	char pBuffer[1025];	
	strBuffer.Format(_T("GTDVCP %d"), iIndex);
	this->SendString(strBuffer, TRUE);
	while(iLen <= 0)
	{
		while(4-iRec > 0 && iTransferSize == 0)
		{
			iLen = this->d_sSender.Receive(&pBuffer[iRec], 4-iRec);
			if(iLen > -1)
				iRec += iLen;
		}
		iRec = 0;
		if(iTransferSize == 0)
			iTransferSize = ::atol(pBuffer);
		while(iTransferSize - iRec > 0)
		{
			iLen = this->d_sSender.Receive(&pBuffer[iRec], iTransferSize-iRec);
			if(iLen > -1)
				iRec += iLen;
		}
		pBuffer[iLen] = '\0';
		Sleep(25);
	}
	intRealWidth = ::atol(pBuffer);
	return intRealWidth;
}

Code:
void HDocumentPrint::Print(BOOL bBeginNewPage)
{
		CString strBuffer;
		DWORD iTransferSize = 0;
		int iLen = -1;
		if(bBeginNewPage)
		{
			strBuffer.Format(_T("DOPRNT %s"), _T("true"));
		}
		else
		{
			strBuffer.Format(_T("DOPRNT %s"), _T("false"));
		}
		this->SendString(strBuffer, TRUE);
		this->WaitForOK();
		if(this->GetIsPrint())
		{
			this->SwitchIsPrint();
			this->EOPJ();	
		}
}
(WaitForOk() vgl. GetDeviceCaps)
Dies sind meine SendString funktionen, die nichts weiter tun als mir jedesmal Größe lesen, senden, größe lesen, senden... zu vereinfachen, und die Sonstigen betroffenen Codeausschnitte.

Ich hab nun Folgendes Problem:
Ich sende von Client A an Server S eine Anfrage/einen Auftrag. Dieser wird auf dem Server soweit korrekt verarbeitet. Der Server sendet auf bestimmte Kommandos eine Antwort. Hier geht teilweise massiv Zeit verloren, hab ich irgendwelche Einflussmöglichkeiten den Vorgang weiter zu beschleunigen?

Hier ein Auszug aus der Log:
Empfange Daten - Unmittelbar nach Sprung in OnReceive(), erster Sprung: Größe des Blocks, zweiter Sprung - die Tatsächlichen Daten, diese werden dann zerlegt (siehe GROSS geschriebene Anweisungen) und verarbeitet.
Code:
04.06.2009 16.38.41:417 Instanz: 1 -> OnReceive(); - Empfange Daten
04.06.2009 16.38.41:589 Instanz: 1 -> OnReceive(); - Empfange Daten
04.06.2009 16.38.41:605 Instanz: 1 -> onRec() Anweisung: PRINT
04.06.2009 16.38.41:620 Instanz: 1 -> PrintJob() Anweisung: PRINTER EPSON TM-H5000II Partial cut:LPT1:
04.06.2009 16.38.41:636 Instanz: 1 -> PrintJob() Anweisung: PRINTDR EPSON TM-H5000II Partial cut
04.06.2009 16.38.41:636 Instanz: 1 -> PrintJob() Anweisung: PRINTOR true
04.06.2009 16.38.41:636 Instanz: 1 -> PrintJob() Anweisung: PRINTSZ 11
04.06.2009 16.38.41:636 Instanz: 1 -> PrintJob() Anweisung: PRINTPQ -3
04.06.2009 16.38.41:652 Instanz: 1 -> PrintJob() Anweisung: PRINTCC 6
04.06.2009 16.38.41:652 Instanz: 1 -> PrintJob() Anweisung: CRCTXT 
04.06.2009 16.38.41:714 Instanz: 1 -> PrintJob() Anweisung: GTDVCP 4
04.06.2009 16.38.41:871 Instanz: 1 -> OnReceive(); - Empfange Daten
04.06.2009 16.38.41:996 Instanz: 1 -> OnReceive(); - Empfange Daten
04.06.2009 16.38.41:996 Instanz: 1 -> PrintJob() Anweisung: GTDVCP 4
04.06.2009 16.38.42:168 Instanz: 1 -> OnReceive(); - Empfange Daten
04.06.2009 16.38.42:293 Instanz: 1 -> OnReceive(); - Empfange Daten

Hier noch krasser nach DOPRNT / EOPJ
Code:
04.06.2009 16.38.45:576 Instanz: 1 -> OnReceive(); - Empfange Daten
04.06.2009 16.38.45:716 Instanz: 1 -> OnReceive(); - Empfange Daten
04.06.2009 16.38.45:716 Instanz: 1 -> PrintJob() Anweisung: ADDLNE 600:6000:7884:0:50:0
04.06.2009 16.38.45:732 Instanz: 1 -> PrintJob() Anweisung: STFONT Arial:10:false:false:false:false
04.06.2009 16.38.45:732 Instanz: 1 -> PrintJob() Anweisung: STCOCP 8084:0
04.06.2009 16.38.45:747 Instanz: 1 -> PrintJob() Anweisung: ADCOPT Enth.~false:0:false:2:-1:-1
04.06.2009 16.38.45:747 Instanz: 1 -> PrintJob() Anweisung: ADCOPT MwSt  19.00 % =~false:0:false:3:-1:-1
04.06.2009 16.38.45:747 Instanz: 1 -> PrintJob() Anweisung: ADCOPT 0,87 Eu~false:1:false:5:-1:-1
04.06.2009 16.38.45:763 Instanz: 1 -> PrintJob() Anweisung: STCSNR 
04.06.2009 16.38.45:763 Instanz: 1 -> PrintJob() Anweisung: ADCOPT GKV-Zuzahlung =~false:0:false:1:-1:-1
04.06.2009 16.38.45:763 Instanz: 1 -> PrintJob() Anweisung: ADCOPT 5,00 Eu~true:1:false:5:-1:-1
04.06.2009 16.38.45:763 Instanz: 1 -> PrintJob() Anweisung: STCSNR 
04.06.2009 16.38.45:779 Instanz: 1 -> PrintJob() Anweisung: ADCOPT Ges. Mehrkosten~false:0:false:2:-1:-1
04.06.2009 16.38.45:779 Instanz: 1 -> PrintJob() Anweisung: ADCOPT =~false:0:false:4:-1:700
04.06.2009 16.38.45:779 Instanz: 1 -> PrintJob() Anweisung: ADCOPT 0,46 Eu~true:1:false:5:-1:-1
04.06.2009 16.38.45:779 Instanz: 1 -> PrintJob() Anweisung: STCSNR 
04.06.2009 16.38.45:794 Instanz: 1 -> PrintJob() Anweisung: STFONT Arial:10:false:false:false:false
04.06.2009 16.38.45:794 Instanz: 1 -> PrintJob() Anweisung: STCSNR 
04.06.2009 16.38.45:794 Instanz: 1 -> PrintJob() Anweisung: STCSNR 
04.06.2009 16.38.45:794 Instanz: 1 -> PrintJob() Anweisung: STCSNR 
04.06.2009 16.38.45:810 Instanz: 1 -> PrintJob() Anweisung: DOPRNT true
04.06.2009 16.38.47:092 Instanz: 1 -> OnReceive(); - Empfange Daten
04.06.2009 16.38.47:561 Instanz: 1 -> OnClose();
04.06.2009 16.38.48:030 Instanz: 1 -> this->SwitchBlockStatus(); - Gebe Socket frei
04.06.2009 16.38.48:452 Instanz: 1 -> OnReceive(); - Empfange Daten
04.06.2009 16.38.48:921 Instanz: 1 -> PrintJob() Anweisung: EOPJ 
04.06.2009 16.38.49:280 Instanz: 1 -> EOPJ 
04.06.2009 16.38.49:749 Instanz: 1 -> OnReceive(); - Empfange Daten
04.06.2009 16.38.50:172 Instanz: 1 -> OnReceive(); - Empfange Daten
04.06.2009 16.38.50:641 Instanz: 1 -> onRec() Anweisung: QUIT


MfG,

Dave
 
So kleine Anmerkung: Hatte intelligenterweise die deaktivierung des Nagle-Algorithmus VOR die Initialisierung AfxSocketInit gemacht. Bin inzwischen von gesamt ~10 Sekunden auf etwa 2 bis 3 Sekunden.
Zwischen senden und Empfangen der Daten hab ich nun noch knapp ne Verzögerung von 15ms bis 45ms. Eigentlich voll im Rahmen. Falls es sons noch Vorschläge gibt, immer her damit, ansonsten kann das hier wohl als erledigt betrachtet werden.

Danke fürs anschaun, Gruß Dave

/e: Die Lösung war damit:
Code:
BOOL bBuf = TRUE;
if(!this->SetSockOpt(TCP_NODELAY, &bBuf, sizeof(BOOL), IPPROTO_TCP))
{
   this->ShowErr(); //Falls Fehler anzeigen
}
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück