ERLEDIGT
JA
JA
ANTWORTEN
1
1
ZUGRIFFE
407
407
EMPFEHLEN
-
04.06.09 17:22 #1
- Registriert seit
- Feb 2004
- Ort
- Ehingen (BW)
- Beiträge
- 41
So, morgen Jungs, mal wieder ne Frage betreff CAsyncSocket, bzw. allgemein der Socketkommunikation.
Serverseitig:
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
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 :1 2 3 4 5 6 7 8
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 :1 2 3 4 5 6 7 8 9 10 11 12 13
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 :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
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 :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
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; }
(WaitForOk() vgl. GetDeviceCaps)Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
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(); } }
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 :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
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 :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
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
-
09.06.09 08:48 #2
- Registriert seit
- Feb 2004
- Ort
- Ehingen (BW)
- Beiträge
- 41
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 :1 2 3 4 5
BOOL bBuf = TRUE; if(!this->SetSockOpt(TCP_NODELAY, &bBuf, sizeof(BOOL), IPPROTO_TCP)) { this->ShowErr(); //Falls Fehler anzeigen }Geändert von PoebelundGesocks (09.06.09 um 08:54 Uhr) Grund: Lösung als Code, Code-Tags
Ähnliche Themen
-
CAsyncSocket - zwei Strings senden und einen empfangen
Von Bastian N im Forum VisualStudio & MFCAntworten: 7Letzter Beitrag: 17.04.09, 10:00 -
CAsyncSocket Daten senden
Von Anfänger92 im Forum VisualStudio & MFCAntworten: 1Letzter Beitrag: 02.07.07, 21:35 -
COM-Port Senden/Empfangen
Von PingOfDeath1983 im Forum Visual Basic 6.0Antworten: 1Letzter Beitrag: 24.04.07, 11:14 -
Daten Senden & Empfangen über RS-232
Von Paella im Forum Delphi, Kylix, PascalAntworten: 3Letzter Beitrag: 06.08.06, 19:58 -
[MSVC++] Daten über COM1-Port an display senden
Von Allvater im Forum C/C++Antworten: 5Letzter Beitrag: 08.08.03, 12:42





Zitieren
Login






