CAsyncSocket und Unicode



  • Hallo

    In meiner MFC Applikation (Unicode) verwende ich die Klasse CAsyncSocket um Daten zu senden / empfangen.

    Mein Problem ist, dass ich immer nur die erste Ziffer vom gesendeten String erhalte.

    Ich habe schon mit Ethereal die Pakete analysiert.
    Wenn ich den String "!SENDEN!" sende, steht im Ethereal "!. S.E.N. ".
    Und beim empfangen kommt wie schon erwähnt nur "!" heraus.

    Hat das etwas mit dem Unicode zu tun?

    Danke.



  • Nein, das hat damit zu tun, dass du die Daten entweder falsch ausliest, oder nach dem Auslesen falsch ausgibst. Möglichweise gibst du die Daten über einen char* aus. Dabei wird das Nullbyte, das zum ersten Zeichen gehört, als Stringende interpretiert.



  • In MSDN steht folgendes: "You are responsible for handling blocking, byte-order differences, and conversions between Unicode and multibyte character set (MBCS) strings."
    Deshalb bin ich auf Unicode gekommen.

    Ja das mit dem char* stimmt!
    Ich arbeite auf VS 2005.
    Aber auf VS 2003 habe ich fast das selbe gemacht und dort funktioniert es.

    Hier der Code:

    Senden

    void CChatDlg::OnSenden()
    {
    	CString strData = _TEXT("!SENDEN!");
    	m_ConnectSocket.Send(strData, strData.GetLength());
    }
    

    Empfangen

    void CChatDlg::OnEmpfangen()
    {
       char *Buffer = new char[1025];
       int BufferSize = 1024;
       int Rcvd;
       CString strRecvd;
    
       // Nachricht abholen
       Rcvd = m_ConnectSocket.Receive(Buffer, BufferSize);
    
       // Ende der Nachricht abschneiden
       Buffer[Rcvd] = NULL;
    
       // Nachricht in die CString-Variable verweisen
       strRecvd = Buffer;
       AfxMessageBox(strRecvd);
    }
    


  • Und damit hast du auch schon deinen Fehler - du hast das "You are responsible for handling blocking..." kurzerhand ignoriert. Erstens mußt du auf der Senderseite die Datenlänge in BYTE angeben (UNICODE-Zeichen sind idR 2 bis 4 Byte groß) und zweitens mußt du auf der Senderseite den String wieder als UNICODE (wchar_t) interpretieren).

    (ältere MFC-Versionen waren noch per Default auf ANSI-Modus eingestellt, da stimmten deine Umwandlungen)

    void CChatDlg::OnSenden()
    {
        CString strData = _TEXT("!SENDEN!");
        m_ConnectSocket.Send(strData, strData.GetLength()*sizeof(TCHAR));
    }
    
    void CChatDlg::OnEmpfangen()
    {
       TCHAR *Buffer = new TCHAR[1025];
       int BufferSize = 1024*sizeof(TCHAR);
       int Rcvd;
       CString strRecvd;
    
       // Nachricht abholen
       Rcvd = m_ConnectSocket.Receive(Buffer, BufferSize)/sizeof(TCHAR);
    
       // Ende der Nachricht abschneiden
       Buffer[Rcvd] = NULL;
    
       // Nachricht in die CString-Variable verweisen
       strRecvd = Buffer;
       AfxMessageBox(strRecvd);
    }
    


  • Aha!
    Jetzt klappts!

    Vielen Dank! Super. 😉



  • Ich schließe mich hier mal an.

    Sender:

    CString lo(_T(""));
    lo.Format(_T("s;%4f;%4f;%s"),_T("AAA;BBB;CCCC;DDD;EEEE"),  m_GPS_Position.dblLatitude, m_GPS_Position.dblLongitude, _T("FFFF"));
    
    Send(lo,lo.getLength()*sizeof(TCHAR));
    

    Empfänger:

    TCHAR *pBuf= new TCHAR[1025];
    int iLen;
    	iLen=this->sockets[sockpos].Receive(pBuf,1024*sizeof(TCHAR))/sizeof(TCHAR);
    pBuf[iLen]=NULL;
    CString strData(pBuf);
    

    Soweit so gut. Allerdings kommt nie das an was ankommen soll. Über die Leitung wird allerdings alles übertragen (nachgeschaut mit Wireshark).

    Jemand ne Idee?



  • Holst du auch über den richtigen Socket ab? So wie dein konstrukt aussieht hast du ja mehrere davon, nur so mal als Vermutung, denn anhand deiner 3 Zeilen Quelltext und der aussage es wird richtig übertragen aber es kommt net alles an, müsste man schon ne Kristallkugel haben und meine is leider zur Zeit in der Werkstatt



  • das socket stimmt 🙂

    es kommt folgendes an "AAA;BBB;CCCC;DDD;EEEE"
    danach bricht er einfach ab 🙂

    komisch ist auch wenn ich einen festen String übergebe also beispielsweise

    CString a(_T("AAAABBBBCCCDDD4.3333CCCCCC5.6666"));
    

    kommt alles an, also der komplette String.



  • kann es vielleicht sein das alles ankommt du aber ne 0 zwischendrin hast (warum auch immer nur mal ins blaue vermutet) und du deswegen net alles im string hast? Hast du mal ilen der receive überprüft, ob das mit der versendeten größe übereinstimmt?



  • hm scheint echt so zu sein. fraglich nur wo sie herkommt.



  • evert schrieb:

    hm scheint echt so zu sein. fraglich nur wo sie herkommt.

    na die Frage kannst nur du beantworten, aber wenn du mal den Debuger bemühst könnte man das raus finden, vielleicht schleicht der sich schon beim senden rein? Dein Wireshark wird dir doch bestimmt die Daten auch anzeigen können, also irgendwo wird sich das ja fiden lassen



  • Beim Senden sind sie definitiv schon drin 🙂

    werd morgen mal genauer nachschauen



  • Die 0 wird definitiv schon mitübertragen. im CString kann ich sie allerdings nicht finden.

    Der String wird wie oben beschrieben zusammen gesetzt.
    Sehr merkwürdig alles



  • Problem gelöst

    mit CStringA funzt alles herrlich


Anmelden zum Antworten