Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » VC++ / MFC » Problem mit Verbindungsaufbau per Casyncsocket

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: [ 1 ] > 2 < [ 3 ] [ 4 ]
010
09.09.2003, 21:00 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


ich würde einfach den Rechnernamen (GetComputerName oder so) ermitteln und per gethostbyname(...) die ip adresse ermitteln.
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
011
10.09.2003, 03:03 Uhr
~Philipp
Gast


Ok thx, das klapptjetzt, ich hab das so realisiert:


C++:
int ChatCore::GetLocalIPs()
{
    CChatServerDlg *pDlg=(CChatServerDlg*)AfxGetMainWnd();
    
    char ComputerName[256];
    DWORD dwBufferLength=256;
    GetComputerName(ComputerName,&dwBufferLength);

    HOSTENT *ComputerNetInfo;
    ComputerNetInfo=gethostbyname(ComputerName);
    
    int i=0;
    while(ComputerNetInfo->h_addr_list[i]!=NULL)
    {
        CString m_strLocalIP;
        int        IPBytes[4];

        IPBytes[0]=256+(int)*(ComputerNetInfo->h_addr_list[i]);
        IPBytes[1]=256+(int)*(ComputerNetInfo->h_addr_list[i]+1);
        IPBytes[2]=(int)*(ComputerNetInfo->h_addr_list[i]+2);
        IPBytes[3]=(int)*(ComputerNetInfo->h_addr_list[i]+3);

        m_strLocalIP.Format("%d.%d.%d.%d",IPBytes[0],IPBytes[1],IPBytes[2],IPBytes[3]);
        pDlg->m_IPAddress.AddString(m_strLocalIP);
        i++;
    }
    
    if(i==0)
    {
        // Wird ausgeführt wenn die Whileschleife kein Mal durchlaufen wurde, da
        // gethostbyname keine IP zurückliefern konnte!
        AfxMessageBox("rofl");
        return CCORE_ERROR;
    }

    pDlg->UpdateData(false);

    return CCORE_SUCCESS;
}



Meine Frage ist nun : Wenn ich die Werte aus z.B. h_addr_list[0] in den 4-int-array schreibe, dann kommt da normalerweise kacke raus(bei meiner IP von 192.168.x.x kommt raus -64.-88.x.x). Wenn ich nun bei beiden ints 256 dazuaddiere stimmt die adresse. Das ist doch sicherlich nicht normal das man das machen muss oder???
Und ein problem ergibt sich, wenn ich meine beiden netzwerkverbindungen deaktivierte: Dann gibt er mir als IP korrekterweise 127.0.0.1 zurück, nur addiere ich ja immer +256 bei den Bytes 1 und 2 dazu, und das gibt dann eine IP der Form 383.256.x.x und das ist ja Müll... also muss doch noch irgendwo ein Fehler sein! Nur wo?

Philipp

Dieser Post wurde am 10.09.2003 um 09:40 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
012
10.09.2003, 09:43 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


das problem liegt daran das char signed ist (-128 bis +128) die IP-Adresse aber 0-255 (unsigned char == BYTE)


C++:
        IPBytes[0]=(BYTE)(ComputerNetInfo->h_addr_list[ i ]);
        IPBytes[1]=(BYTE)(ComputerNetInfo->h_addr_list[ i ]+1);
        IPBytes[2]=(BYTE)(ComputerNetInfo->h_addr_list[ i ]+2);
        IPBytes[3]=(BYTE)(ComputerNetInfo->h_addr_list[ i ]+3);


--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
013
11.09.2003, 17:12 Uhr
~Philipp
Gast


Nochmal ein problem, also der Chat an sich klappt jetzt, hab die Struktur jetzt halt ein bisschen verändert!

Mein Problem ist, ich muss die geschrieben MEssages ja irgendwie ausgeben.
Ich mach das halt so, das ich eine CString Variable erstelle, und die Formatiere, halt die empfangene Nachricht an sich da rein, dann Datum, Name des Senders, und ein "\n" zeichen, damit er in die nächste Zeile springt.

Problem ist : Wenn ich als Steuerelement eine editbox nehme, dann ignoriert er diese "\n" und "\t" zeichen, aber dafür hab ich nen automatischen bildlauf. Nehm ich ein normales Textfeld, dann klappt das mit den "\n" und "\t" Zeichen zwar, aber dafür hab ich keinen automatischen Bildlauf, außerdem hätt ich gerne nen weißen Hintergrund, den hab ich da aber auch net!

Meine Frage ist halt nun, wie kann ich diese Merkmale in einem Steuerelement vereinen : Also

1) Beachtung von "\n" und "\t" Zeichen
2) automatischer Bildlauf
3) Möglichst weißer Hintergrund
4) Unveränderbar(schreibgeschützt gegenüber dem user)

wie gesagt erfüllen afaik editbox und textbox nur jeweils einen teil dieser anforderungen.

Philipp
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
014
11.09.2003, 18:19 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


\n kannste mit editbox erreichen in dem du MultiLine aktivierst.
\t wirst du ohne manuelles parsen nicht erreichen können
Für weißen Hintergrund musst du halt in OnPaint "rumpfuschen"
unveränderbar: einfach Read Only bei der Editbox anmachen.
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
015
11.09.2003, 18:56 Uhr
~philipp
Gast


mhhh ok, gerade versucht:

Editbox(schreibgeschützt, mehrzeilig):

- \n wird nicht akzeptiert, \t hingegen schon
- Hintergrundfarbe =grau

=> Wäre es nicht besser, wenn ich einfach für die Textbox den automatischen Bildlauf irgendwie aktivieren könnte? Weiß halt nur net wie das geht. Funktioniert das irgendwie mit den Bildlaufleisten die man über die toolbox im Dialogfeldeditor da einfügen kann?

Philipp
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
016
11.09.2003, 19:14 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


achja, die editbox erwartet \r\n und nicht nur \n! das musst du halt entsprechend ändern...
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
017
13.09.2003, 22:59 Uhr
Philipp



Boahhh... ich hätte nicht gedacht das bei so ner einfachen Anwendung so viele Probs auftreten können

Also, ich hab ein Editfeld, in dem ich jetzt den geschriebenen Text ausgeben lasse, hat auch schon (bis auf den weißen Hintergrund) alle Eigenschaften die ich brauche! Jetzt will ich allerdings automatisch scrollen wenn eine neue Nachricht eintrifft, sodass der Benutzer immer die aktuelle Nachricht sieht.

Also in der MSDN geschaut : CEdit::LineScroll()

So, hier rufe ich die auf :


C++:
int ChatCore::MessageReceived(CString Buffer,CString UserName)
{
    CChatServerDlg *pDlg=(CChatServerDlg*)AfxGetMainWnd();

    CString NewMessage;
    NewMessage=UserName;
    NewMessage+=" (";
    NewMessage+=GetTime();
    NewMessage+=") :\t";
    NewMessage+=Buffer;
    NewMessage+="\r\n";
    
    for(int i=0;i<iMaxClients-1;i++)
    {
        if(pUserNetSocket[i].bConnected==true)
        {
            pUserNetSocket[i].Send(NewMessage,1000);
        }
    }
    
    pDlg->m_strMessages+=NewMessage;
    
    int CurVisibleLine=pDlg->m_ctrlMessages.GetFirstVisibleLine();
    int MaxLine=pDlg->m_ctrlMessages.GetLineCount();
    pDlg->m_ctrlMessages.LineScroll(MaxLine-CurVisibleLine-5);
    //pDlg->m_ctrlMessages.LineScroll();
    
    pDlg->m_ctrlMessages.UpdateData(false);
    pDlg->UpdateData(false);
    
    return CCORE_SUCCESS;
}



MessageReceived wird halt immer dann aufgerufen, wenn eine neue Message von einem Socket empfangen wurde. Hab das auch nachgeprüft. Das Problem ist nur, egal was ich mache, die EditBox(ist übrigends m_ctrlMessages) will einfach net scrollen, egal ob ich jetzt LineScroll(1) oder wie oben LineScroll(MaxLine-...) mache! Mehrzeilig ist die Editbox, ja!

Woran könnte das liegen?

btw: hab mich mal angemeldet
THX
Philipp
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
018
13.09.2003, 23:26 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


LineScroll hat bei mir auch noch nie funktioniert! Probier einfach mal folgendes:
Setz den Cursor auf das letzte Zeichen (Er scrollt ja dann automatisch den Inhalt)
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
019
14.09.2003, 00:19 Uhr
Philipp



Ok, hab ich versucht, und zwar folgendermaßen:

m_strMessages : Typ CString, zu der Editbox zugeordnet
m_ctrlMessages : Typ CEdit, ebenfalls zur Editbox zugeordnet


C++:
pDlg->UpdateData(true)
//...
pDlg->m_ctrlMessages.SetSel(pDlg->m_strMessages.GetLength()-1,pDlg->m_strMessages.GetLength());
//...
pDlg->UpdateData(false);



Aber das funktioniert nicht! GetLength() gibt die richtigen Werte zurück, trotzdem markiert der nix, und die Editbox wird auch net gescrollt.

Philipp

Dieser Post wurde am 14.09.2003 um 00:20 Uhr von Philipp editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: [ 1 ] > 2 < [ 3 ] [ 4 ]     [ VC++ / MFC ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: