Ein eigener Chat



  • Hallo liebe Community,

    Ich hatte vor einen eigenen Chat zu schreiben, und zwar mit dem Borland C++ Builder 6. Ich wollte dies mithilfe des TWinSockets realisieren, und habe hier den Code:

    Server:

    //---------------------------------------------------------------------------
    
    #include <vcl.h>
    #pragma hdrstop
    
    #include "Unit1.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    bool switcher=1;
    AnsiString Banlist[100];
    bool Banactive=false;
    bool Multiactive=false;
    int BanCount=0;
    AnsiString IPList[100];
    AnsiString NickList[100];
    struct data
    {
            AnsiString text;
            AnsiString name;
            int type;  //1=Normalpost; 2=Servermeldungen 3=Willkommen 4=PM 5=Nickname 6=Nicknametausch
            AnsiString dest; //Für PMs
            AnsiString IPList[100];
            AnsiString NickList[100];
    };
    data *paket;
    //---------------------------------------------------------------------------
    void AddMessage(TRichEdit *re,AnsiString name, AnsiString msg)
    {
            re->SelStart=re->Text.Length();
            re->SelAttributes->Style=re->SelAttributes->Style<<fsBold;
            re->SelText="<"+name+">"+":   ";
            re->SelAttributes->Style=re->SelAttributes->Style>>fsBold;
            re->SelText=msg+"\n";
    }
    //---------------------------------------------------------------------------
    void ScrollDown(TRichEdit *re)
    {
            re->Perform(EM_SCROLLCARET,0,0);
            re->SelStart=re->Text.Length();
    }
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::FormCreate(TObject *Sender)
    {
    RichEdit1->Clear();
    Memo2->Clear();
    Memo3->Clear();
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    ServerSocket1->Open();
    RichEdit1->SelAttributes->Style = RichEdit1->SelAttributes->Style << fsBold << fsItalic;
    RichEdit1->Lines->Add("Server wurde gestartet.");
    RichEdit1->SelAttributes->Style = RichEdit1->SelAttributes->Style << fsBold << fsUnderline;
    RichEdit1->Lines->Add("+++Willkommen im HJG-Chat+++");
    RichEdit1->SelAttributes->Style = RichEdit1->SelAttributes->Style << fsItalic;
    RichEdit1->Lines->Add("~"+Memo3->Text+"~");
    Label5->Caption="Server gestartet";
    ScrollDown(RichEdit1);
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button2Click(TObject *Sender)
    {
    ServerSocket1->Close();
    ListBox1->Clear();
    ComboBox1->Clear();
    ListBox2->Clear();
    RichEdit1->SelAttributes->Style = RichEdit1->SelAttributes->Style << fsBold << fsItalic;
    RichEdit1->Lines->Add("Server wurde gestoppt.");
    Label5->Caption="Server gestoppt";
    ScrollDown(RichEdit1);
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::ServerSocket1ClientRead(TObject *Sender,
          TCustomWinSocket *Socket)
    {
    Socket->ReceiveBuf(&paket,sizeof(paket));
    if(paket->type==5)
    {
            ListBox2->Items->Add(paket->name);
            for(int i=0;i<ListBox1->Items->Count;i++)
                    paket->IPList[i]=ListBox1->Items->operator [](i);
            for(int i=0;i<ListBox2->Items->Count;i++)
                    paket->NickList[i]=ListBox2->Items->operator [](i);
            paket->type=7;
            for (int i=0;i<ServerSocket1->Socket->ActiveConnections;i++)
                    ServerSocket1->Socket->Connections[i]->SendBuf(paket,sizeof(paket));
    }
    else if(paket->type==6)
    {
            ListBox2->Items->operator [](ListBox1->Items->IndexOf(Socket->RemoteAddress))=paket->name;
            for(int i=0;i<ListBox1->Items->Count;i++)
                    paket->IPList[i]=ListBox1->Items->operator [](i);
            for(int i=0;i<ListBox2->Items->Count;i++)
                    paket->NickList[i]=ListBox2->Items->operator [](i);
            paket->type=7;
            Socket->SendBuf(paket,sizeof(paket));
            for (int i=0;i<ServerSocket1->Socket->ActiveConnections;i++)
                    ServerSocket1->Socket->Connections[i]->SendBuf(paket,sizeof(paket));
    }
    else if(paket->type==4)
    {
            for(int i=0;i<ServerSocket1->Socket->ActiveConnections;i++)
                    if(ServerSocket1->Socket->Connections[i]->RemoteAddress==paket->dest)
                    {
                            ServerSocket1->Socket->Connections[i]->SendBuf(paket,sizeof(paket));
                            ScrollDown(RichEdit1);
                            return;
                    }
    }
    else
    {
            AddMessage(RichEdit1,Socket->RemoteAddress,paket->name+":   "+paket->text);
            //RichEdit1->Lines->Add(Socket->RemoteAddress+":   "+text);
            for (int i=0;i<ServerSocket1->Socket->ActiveConnections;i++)
                    ServerSocket1->Socket->Connections[i]->SendBuf(paket,sizeof(paket));
            ScrollDown(RichEdit1);
    }
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button3Click(TObject *Sender)
    {
    if(switcher)
            RichEdit1->Hide();
    else
            RichEdit1->Show();
    switcher=!switcher;
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::Button4Click(TObject *Sender)
    {
    paket->name="Administrator";
    paket->type=1;
    paket->text=Memo2->Text;
    for (int i=0;i<ServerSocket1->Socket->ActiveConnections;i++)
            ServerSocket1->Socket->Connections[i]->SendBuf(paket,sizeof(paket));
    AddMessage(RichEdit1,"Administrator",Memo2->Text);
    Memo2->Clear();
    ScrollDown(RichEdit1);
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::Memo2KeyDown(TObject *Sender, WORD &Key,
          TShiftState Shift)
    {
            if(Key==VK_RETURN)
                    {
                            paket->name="Administrator";
                            paket->type=1;
                            paket->text=Memo2->Text;
                            for (int i=0;i<ServerSocket1->Socket->ActiveConnections;i++)
                                    ServerSocket1->Socket->Connections[i]->SendBuf(paket,sizeof(paket));
                            AddMessage(RichEdit1,"Administrator",Memo2->Text);
                            Memo2->Clear();
                            ScrollDown(RichEdit1);
                    }
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::ServerSocket1ClientConnect(TObject *Sender,
          TCustomWinSocket *Socket)
    {
            for(int i=0;i<=BanCount;i++)
            {
                    if(Banlist[i]==Socket->RemoteAddress)
                            {
                                    paket->text="*Du bist gebannt.*";
                                    paket->type=2;
                                    Socket->SendBuf(paket,sizeof(paket));
                                    Banactive=true;
                                    Socket->Close();
                                    return;
                            }
            }
            for(int i=0;i<ListBox1->Items->Count;i++)
            {
                    if(ListBox1->Items->operator [](i)==Socket->RemoteAddress)
                            {
                                    paket->text="*Mehrere Clients verboten.*";
                                    paket->type=2;
                                    Socket->SendBuf(paket,sizeof(paket));
                                    Multiactive=true;
                                    ListBox1->Items->Add(Socket->RemoteAddress);
                                    ComboBox1->Items->Add(Socket->RemoteAddress);
                                    Socket->Close();
                                    return;
                            }
            }
            ListBox1->Items->Add(Socket->RemoteAddress);
            ComboBox1->Items->Add(Socket->RemoteAddress);
            RichEdit1->SelAttributes->Style = RichEdit1->SelAttributes->Style << fsItalic;
            RichEdit1->Lines->Add(Socket->RemoteAddress+" betritt den Chat");
            paket->text="+++Willkommen im HJG-Chat+++\n";
            paket->type=3;
            Socket->SendBuf(paket,sizeof(paket));
            paket->text="~"+Memo3->Text+"~";
            paket->type=2;
            Socket->SendBuf(paket,sizeof(paket));
            for(int i=0;i<ListBox1->Items->Count;i++)
                    paket->IPList[i]=ListBox1->Items->operator [](i);
            for(int i=0;i<ListBox2->Items->Count;i++)
                    paket->NickList[i]=ListBox2->Items->operator [](i);
            paket->type=7;
            Socket->SendBuf(paket,sizeof(paket));
            ScrollDown(RichEdit1);
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::ServerSocket1ClientDisconnect(TObject *Sender,
          TCustomWinSocket *Socket)
    {
            if(!Banactive && !Multiactive)
            {
                    RichEdit1->SelAttributes->Style = RichEdit1->SelAttributes->Style << fsItalic;
                    RichEdit1->Lines->Add(Socket->RemoteAddress+" verlässt den Chat");
            }
            Banactive=false;
            Multiactive=false;
            ListBox1->Items->Delete(ListBox1->Items->IndexOf(Socket->RemoteAddress));
            ComboBox1->Items->Delete(ComboBox1->Items->IndexOf(Socket->RemoteAddress));
            ListBox2->Items->Delete(ListBox1->Items->IndexOf(Socket->RemoteAddress));
            for(int i=0;i<ListBox1->Items->Count;i++)
                    paket->IPList[i]=ListBox1->Items->operator [](i);
            for(int i=0;i<ListBox2->Items->Count;i++)
                    paket->NickList[i]=ListBox2->Items->operator [](i);
            paket->type=7;
            Socket->SendBuf(paket,sizeof(paket));
            ScrollDown(RichEdit1);
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::Button5Click(TObject *Sender)
    {
            paket->text="*<Administrator> hat dich gekickt. Grund: \""+Memo2->Text+"\"*";
            paket->type=2;
            ServerSocket1->Socket->Connections[ComboBox1->ItemIndex]->SendBuf(paket,sizeof(paket));
            Memo2->Clear();
            RichEdit1->SelAttributes->Style = RichEdit1->SelAttributes->Style << fsItalic;
            RichEdit1->Lines->Add("*"+ServerSocket1->Socket->Connections[ComboBox1->ItemIndex]->RemoteAddress+" wurde gekickt.*");
            ServerSocket1->Socket->Connections[ComboBox1->ItemIndex]->Close();
            ScrollDown(RichEdit1);
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::Button6Click(TObject *Sender)
    {
            paket->name="Administrator";
            paket->text=Memo2->Text;
            paket->type=4;
            ServerSocket1->Socket->Connections[ComboBox1->ItemIndex]->SendBuf(paket,sizeof(paket));
            RichEdit1->SelAttributes->Style = RichEdit1->SelAttributes->Style << fsItalic << fsBold;
            RichEdit1->Lines->Add("*<Administrator> (PM): "+Memo2->Text+"*");
            Memo2->Clear();
            ScrollDown(RichEdit1);
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::Button7Click(TObject *Sender)
    {
            paket->text="*<Administrator> hat dich gebannt. Grund: \""+Memo2->Text+"\"*";
            paket->type=2;
            ServerSocket1->Socket->Connections[ComboBox1->ItemIndex]->SendBuf(paket,sizeof(paket));
            Memo2->Clear();
            Banlist[BanCount]=ServerSocket1->Socket->Connections[ComboBox1->ItemIndex]->RemoteAddress;
            ComboBox2->Items->Add(Banlist[BanCount]);
            BanCount++;
            RichEdit1->SelAttributes->Style = RichEdit1->SelAttributes->Style << fsItalic;
            RichEdit1->Lines->Add("*"+ServerSocket1->Socket->Connections[ComboBox1->ItemIndex]->RemoteAddress+" wurde gebannt.*");
            ServerSocket1->Socket->Connections[ComboBox1->ItemIndex]->Close();
            ScrollDown(RichEdit1);
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::Button8Click(TObject *Sender)
    {
            for(int i=0;i<=BanCount;i++)
            {
                    if(Banlist[i]==ComboBox2->Text && ComboBox2->Text!="")
                            {
                                    Banlist[i]=NULL;
                                    for(int j=0;j<=BanCount;j++)
                                            if(ComboBox2->Items->operator [](j)==ComboBox2->Text)
                                                    ComboBox2->Items->Delete(j);
                                    BanCount--;
                                    RichEdit1->SelAttributes->Style = RichEdit1->SelAttributes->Style << fsItalic;
                                    RichEdit1->Lines->Add("*"+ComboBox2->Text+" wurde entbannt.*");
                                    ScrollDown(RichEdit1);
                                    return;
                            }
            }
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
    {
            if(ServerSocket1->Active)
                    ServerSocket1->Close();
            ShowMessage("HJG-Chat ©2008 by Toddy");
    }
    //---------------------------------------------------------------------------
    

    Client:

    //---------------------------------------------------------------------------
    
    #include <vcl.h>
    #pragma hdrstop
    
    #include "Unit1.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    bool leerpost;
    AnsiString IPList[100];
    AnsiString NickList[100];
    struct data
    {
            AnsiString text;
            AnsiString name;
            int type;  //1=Normalpost; 2=Servermeldungen 3=Willkommen 4=PM 5=Nickname 6=Nicknametausch 7=Initialisierung
            AnsiString dest; //Für PMs
            AnsiString IPList[100];
            AnsiString NickList[100];
    };
    data *paket;
    //---------------------------------------------------------------------------
    void AddMessage(TRichEdit *re,AnsiString name, AnsiString msg)
    {
            re->SelStart=re->Text.Length();
            re->SelAttributes->Style=re->SelAttributes->Style<<fsBold;
            re->SelText="<"+name+">"+":   ";
            re->SelAttributes->Style=re->SelAttributes->Style>>fsBold;
            re->SelText=msg+"\n";
    }
    //---------------------------------------------------------------------------
    void ScrollDown(TRichEdit *re)
    {
            re->Perform(EM_SCROLLCARET,0,0);
            re->SelStart=re->Text.Length();
    }
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::FormCreate(TObject *Sender)
    {
            Memo1->Clear();
            RichEdit1->Clear();
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::ClientSocket1Disconnect(TObject *Sender,
          TCustomWinSocket *Socket)
    {
            RichEdit1->SelAttributes->Style = RichEdit1->SelAttributes->Style << fsItalic;
            RichEdit1->Lines->Add("Du hast den Chat verlassen");
            RadioButton1->Checked=0;
            RadioButton2->Checked=1;
            ComboBox1->Clear();
            ComboBox2->Clear();
            ScrollDown(RichEdit1);
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::ClientSocket1Connect(TObject *Sender,
          TCustomWinSocket *Socket)
    {
    if (ClientSocket1->Active)
    {
            RadioButton1->Checked=1;
            RadioButton2->Checked=0;
            paket->type=5;
            paket->name=Edit1->Text;
            ClientSocket1->Socket->SendBuf(paket,sizeof(paket));
    }
    else
    {
            RichEdit1->Lines->Add("Verbindung fehlgeschlagen");
            RadioButton1->Checked=0;
            RadioButton2->Checked=1;
            ScrollDown(RichEdit1);
    }
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button2Click(TObject *Sender)
    {
            leerpost=true;
            for(int i=1;i<=Memo1->Text.Length();i++)
            {
                    if(Memo1->Text.operator [](i)!=' ')
                    {
                            leerpost=false;
                            break;
                    }
            }
            if(!leerpost)
            {
                    paket->type=1;
                    paket->name=Edit1->Text;
                    paket->text=Memo1->Text;
                    ClientSocket1->Socket->SendBuf(paket,sizeof(paket));
            }
            Memo1->Clear();
            ScrollDown(RichEdit1);
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
    {
            if(ClientSocket1->Active)
                    ClientSocket1->Close();
            ShowMessage("HJG-Chat ©2008 by Toddy");
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::Memo1KeyDown(TObject *Sender, WORD &Key,
          TShiftState Shift)
    {
            if(Key==VK_RETURN)
                    {
                            leerpost=true;
                            for(int i=1;i<=Memo1->Text.Length();i++)
                            {
                                    if(Memo1->Text.operator [](i)!=' ')
                                    {
                                            leerpost=false;
                                            break;
                                    }
                            }
                            if(!leerpost)
                            {
                                    paket->type=1;
                                    paket->name=Edit1->Text;
                                    paket->text=Memo1->Text;
                                    ClientSocket1->Socket->SendBuf(paket,sizeof(paket));
                            }
                            Memo1->Clear();
                            ScrollDown(RichEdit1);
                    }
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::RadioButton1Click(TObject *Sender)
    {
            struct hostent *h;
            h=gethostbyname("tbteam.dyndns.org");
            ClientSocket1->Host=h->h_name;
            ClientSocket1->Open();
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::RadioButton2Click(TObject *Sender)
    {
            ClientSocket1->Close();
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::Edit1Change(TObject *Sender)
    {
            paket->type=6;
            paket->name=Edit1->Text;
            ClientSocket1->Socket->SendBuf(paket,sizeof(paket));
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
            paket->name=Edit1->Text;
            paket->type=4;
            paket->text=Memo1->Text;
            paket->dest=ComboBox2->Items->operator [](ComboBox1->Items->IndexOf(ComboBox1->Text));
            ClientSocket1->Socket->SendBuf(paket,sizeof(paket));
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::ClientSocket1Read(TObject *Sender,
          TCustomWinSocket *Socket)
    {
            Socket->ReceiveBuf(&paket,sizeof(paket));
            switch(paket->type)
            {
            case 1:
                    AddMessage(RichEdit1,paket->name,paket->text);
                    break;
            case 3:
                    RichEdit1->SelAttributes->Style = RichEdit1->SelAttributes->Style << fsBold << fsItalic;
                    RichEdit1->Lines->Add(paket->text);
                    break;
            case 2:
                    RichEdit1->SelAttributes->Style = RichEdit1->SelAttributes->Style << fsItalic;
                    RichEdit1->Lines->Add(paket->text);
                    break;
            case 4:
                    RichEdit1->SelAttributes->Style = RichEdit1->SelAttributes->Style << fsItalic << fsBold;
                    RichEdit1->Lines->Add("*<"+paket->name+"> (PM): "+paket->text+"*");
                    SetForegroundWindow(Form1->Handle);
                    break;
            case 7:
                    for(int i=0;i<paket->IPList->Length();i++)
                            ComboBox2->Items->operator [](i)=paket->IPList[i];
                    for(int i=0;i<paket->NickList->Length();i++)
                            ComboBox1->Items->operator [](i)=paket->NickList[i];
                    break;
            }
    
            ScrollDown(RichEdit1);
    }
    //---------------------------------------------------------------------------
    

    Leider werfen die Programme dauernd Exceptions aus und ich weiß nicht wieso. Vllt liegts daran, dass ich die Parameter bei SendBuf(*void,int) falsch übergebe? Bitte helft mir, ich bin schon fast am verzweifeln!
    Hoffe auf eine zügige Antwort 🙂

    MFG Toddy



  • Hier die neue Version (funktioniert immer noch nicht):
    Server:

    //---------------------------------------------------------------------------
    
    #include <vcl.h>
    #pragma hdrstop
    
    #include "Unit1.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    bool switcher=1;
    AnsiString Banlist[100];
    bool Banactive=false;
    bool Multiactive=false;
    int BanCount=0;
    struct data
    {
            char text[500];
            char name[100];
            int type;  //1=Normalpost; 2=Servermeldungen 3=Willkommen 4=PM 5=Nickname 6=Nicknametausch 7=Initialisierung
            char dest[50]; //Für PMs
            char IPList[100][50];
            char NickList[100][100];
    };
    data *paket;
    //---------------------------------------------------------------------------
    void AddMessage(TRichEdit *re,AnsiString name, AnsiString msg)
    {
            re->SelStart=re->Text.Length();
            re->SelAttributes->Style=re->SelAttributes->Style<<fsBold;
            re->SelText="<"+name+">"+":   ";
            re->SelAttributes->Style=re->SelAttributes->Style>>fsBold;
            re->SelText=msg+"\n";
    }
    //---------------------------------------------------------------------------
    void ScrollDown(TRichEdit *re)
    {
            re->Perform(EM_SCROLLCARET,0,0);
            re->SelStart=re->Text.Length();
    }
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::FormCreate(TObject *Sender)
    {
    RichEdit1->Clear();
    Memo2->Clear();
    Memo3->Clear();
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    ServerSocket1->Open();
    RichEdit1->SelAttributes->Style = RichEdit1->SelAttributes->Style << fsBold << fsItalic;
    RichEdit1->Lines->Add("Server wurde gestartet.");
    RichEdit1->SelAttributes->Style = RichEdit1->SelAttributes->Style << fsBold << fsUnderline;
    RichEdit1->Lines->Add("+++Willkommen im HJG-Chat+++");
    RichEdit1->SelAttributes->Style = RichEdit1->SelAttributes->Style << fsItalic;
    RichEdit1->Lines->Add("~"+Memo3->Text+"~");
    Label5->Caption="Server gestartet";
    ScrollDown(RichEdit1);
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button2Click(TObject *Sender)
    {
    ServerSocket1->Close();
    ListBox1->Clear();
    ComboBox1->Clear();
    ListBox2->Clear();
    RichEdit1->SelAttributes->Style = RichEdit1->SelAttributes->Style << fsBold << fsItalic;
    RichEdit1->Lines->Add("Server wurde gestoppt.");
    Label5->Caption="Server gestoppt";
    ScrollDown(RichEdit1);
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::ServerSocket1ClientRead(TObject *Sender,
          TCustomWinSocket *Socket)
    {
    Socket->ReceiveBuf(&paket,sizeof(paket));
    if(paket->type==5)
    {
            ListBox2->Items->Add(paket->name);
            for(int i=0;i<ListBox1->Items->Count;i++)
                    strncpy(paket->IPList[i],ListBox1->Items->operator [](i).c_str(),sizeof(paket->IPList[i]));
            for(int i=0;i<ListBox2->Items->Count;i++)
                    strncpy(paket->NickList[i],ListBox2->Items->operator [](i).c_str(),sizeof(paket->NickList[i]));
            paket->type=7;
            for (int i=0;i<ServerSocket1->Socket->ActiveConnections;i++)
                    ServerSocket1->Socket->Connections[i]->SendBuf(paket,sizeof(paket));
    }
    else if(paket->type==6)
    {
            ListBox2->Items->operator [](ListBox1->Items->IndexOf(Socket->RemoteAddress))=paket->name;
            for(int i=0;i<ListBox1->Items->Count;i++)
                    strncpy(paket->IPList[i],ListBox1->Items->operator [](i).c_str(),sizeof(paket->IPList[i]));
            for(int i=0;i<ListBox2->Items->Count;i++)
                    strncpy(paket->NickList[i],ListBox2->Items->operator [](i).c_str(),sizeof(paket->NickList[i]));
            paket->type=7;
            Socket->SendBuf(paket,sizeof(paket));
            for (int i=0;i<ServerSocket1->Socket->ActiveConnections;i++)
                    ServerSocket1->Socket->Connections[i]->SendBuf(paket,sizeof(paket));
    }
    else if(paket->type==4)
    {
            for(int i=0;i<ServerSocket1->Socket->ActiveConnections;i++)
                    if(ServerSocket1->Socket->Connections[i]->RemoteAddress==paket->dest)
                    {
                            ServerSocket1->Socket->Connections[i]->SendBuf(paket,sizeof(paket));
                            ScrollDown(RichEdit1);
                            return;
                    }
    }
    else
    {
            AddMessage(RichEdit1,Socket->RemoteAddress,AnsiString("")+paket->name+":   "+paket->text);
            //RichEdit1->Lines->Add(Socket->RemoteAddress+":   "+text);
            for (int i=0;i<ServerSocket1->Socket->ActiveConnections;i++)
                    ServerSocket1->Socket->Connections[i]->SendBuf(paket,sizeof(paket));
            ScrollDown(RichEdit1);
    }
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button3Click(TObject *Sender)
    {
    if(switcher)
            RichEdit1->Hide();
    else
            RichEdit1->Show();
    switcher=!switcher;
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::Button4Click(TObject *Sender)
    {
    strncpy(paket->name,"Administrator",sizeof(paket->name));
    paket->type=1;
    strncpy(paket->text,Memo2->Text.c_str(),sizeof(paket->text));
    for (int i=0;i<ServerSocket1->Socket->ActiveConnections;i++)
            ServerSocket1->Socket->Connections[i]->SendBuf(paket,sizeof(paket));
    AddMessage(RichEdit1,"Administrator",Memo2->Text);
    Memo2->Clear();
    ScrollDown(RichEdit1);
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::Memo2KeyDown(TObject *Sender, WORD &Key,
          TShiftState Shift)
    {
            if(Key==VK_RETURN)
                    {
                            strncpy(paket->name,"Administrator",sizeof(paket->name));
                            paket->type=1;
                            strncpy(paket->text,Memo2->Text.c_str(),sizeof(paket->text));
                            for (int i=0;i<ServerSocket1->Socket->ActiveConnections;i++)
                                    ServerSocket1->Socket->Connections[i]->SendBuf(paket,sizeof(paket));
                            AddMessage(RichEdit1,"Administrator",Memo2->Text);
                            Memo2->Clear();
                            ScrollDown(RichEdit1);
                    }
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::ServerSocket1ClientConnect(TObject *Sender,
          TCustomWinSocket *Socket)
    {
            for(int i=0;i<=BanCount;i++)
            {
                    if(Banlist[i]==Socket->RemoteAddress)
                            {
                                    strncpy(paket->text,"*Du bist gebannt.*",sizeof(paket->text));
                                    paket->type=2;
                                    Socket->SendBuf(paket,sizeof(paket));
                                    Banactive=true;
                                    Socket->Close();
                                    return;
                            }
            }
            for(int i=0;i<ListBox1->Items->Count;i++)
            {
                    if(ListBox1->Items->operator [](i)==Socket->RemoteAddress)
                            {
                                    strncpy(paket->text,"*Mehrere Clients verboten.*",sizeof(paket->text));
                                    paket->type=2;
                                    Socket->SendBuf(paket,sizeof(paket));
                                    Multiactive=true;
                                    ListBox1->Items->Add(Socket->RemoteAddress);
                                    ComboBox1->Items->Add(Socket->RemoteAddress);
                                    Socket->Close();
                                    return;
                            }
            }
            ListBox1->Items->Add(Socket->RemoteAddress);
            ComboBox1->Items->Add(Socket->RemoteAddress);
            RichEdit1->SelAttributes->Style = RichEdit1->SelAttributes->Style << fsItalic;
            RichEdit1->Lines->Add(Socket->RemoteAddress+" betritt den Chat");
            strncpy(paket->text,"+++Willkommen im HJG-Chat+++\n",sizeof(paket->text));
            paket->type=3;
            Socket->SendBuf(paket,sizeof(paket));
            strncpy(paket->text,(AnsiString("~")+Memo3->Text+"~").c_str(),sizeof(paket->text));
            paket->type=2;
            Socket->SendBuf(paket,sizeof(paket));
            for(int i=0;i<ListBox1->Items->Count;i++)
                    strncpy(paket->IPList[i],ListBox1->Items->operator [](i).c_str(),sizeof(paket->IPList[i]));
            for(int i=0;i<ListBox2->Items->Count;i++)
                    strncpy(paket->NickList[i],ListBox2->Items->operator [](i).c_str(),sizeof(paket->NickList[i]));
            paket->type=7;
            Socket->SendBuf(paket,sizeof(paket));
            ScrollDown(RichEdit1);
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::ServerSocket1ClientDisconnect(TObject *Sender,
          TCustomWinSocket *Socket)
    {
            if(!Banactive && !Multiactive)
            {
                    RichEdit1->SelAttributes->Style = RichEdit1->SelAttributes->Style << fsItalic;
                    RichEdit1->Lines->Add(Socket->RemoteAddress+" verlässt den Chat");
            }
            Banactive=false;
            Multiactive=false;
            ListBox1->Items->Delete(ListBox1->Items->IndexOf(Socket->RemoteAddress));
            ComboBox1->Items->Delete(ComboBox1->Items->IndexOf(Socket->RemoteAddress));
            ListBox2->Items->Delete(ListBox1->Items->IndexOf(Socket->RemoteAddress));
            for(int i=0;i<ListBox1->Items->Count;i++)
                    strncpy(paket->IPList[i],ListBox1->Items->operator [](i).c_str(),sizeof(paket->IPList[i]));
            for(int i=0;i<ListBox2->Items->Count;i++)
                    strncpy(paket->NickList[i],ListBox2->Items->operator [](i).c_str(),sizeof(paket->NickList[i]));
            paket->type=7;
            Socket->SendBuf(paket,sizeof(paket));
            ScrollDown(RichEdit1);
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::Button5Click(TObject *Sender)
    {
            strncpy(paket->text,(AnsiString("*<Administrator> hat dich gekickt. Grund: \"")+Memo2->Text.c_str()+"\"*").c_str(),sizeof(paket->text));
            paket->type=2;
            ServerSocket1->Socket->Connections[ComboBox1->ItemIndex]->SendBuf(paket,sizeof(paket));
            Memo2->Clear();
            RichEdit1->SelAttributes->Style = RichEdit1->SelAttributes->Style << fsItalic;
            RichEdit1->Lines->Add("*"+ServerSocket1->Socket->Connections[ComboBox1->ItemIndex]->RemoteAddress+" wurde gekickt.*");
            ServerSocket1->Socket->Connections[ComboBox1->ItemIndex]->Close();
            ScrollDown(RichEdit1);
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::Button6Click(TObject *Sender)
    {
    
            strncpy(paket->name,"Administrator",sizeof(paket->name));
            strncpy(paket->text,Memo2->Text.c_str(),sizeof(paket->text));
            paket->type=4;
            ServerSocket1->Socket->Connections[ComboBox1->ItemIndex]->SendBuf(paket,sizeof(paket));
            RichEdit1->SelAttributes->Style = RichEdit1->SelAttributes->Style << fsItalic << fsBold;
            RichEdit1->Lines->Add("*<Administrator> (PM): "+Memo2->Text+"*");
            Memo2->Clear();
            ScrollDown(RichEdit1);
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::Button7Click(TObject *Sender)
    {
            strncpy(paket->text,(AnsiString("*<Administrator> hat dich gebannt. Grund: \"")+Memo2->Text.c_str()+"\"*").c_str(),sizeof(paket->text));
            paket->type=2;
            ServerSocket1->Socket->Connections[ComboBox1->ItemIndex]->SendBuf(paket,sizeof(paket));
            Memo2->Clear();
            Banlist[BanCount]=ServerSocket1->Socket->Connections[ComboBox1->ItemIndex]->RemoteAddress;
            ComboBox2->Items->Add(Banlist[BanCount]);
            BanCount++;
            RichEdit1->SelAttributes->Style = RichEdit1->SelAttributes->Style << fsItalic;
            RichEdit1->Lines->Add("*"+ServerSocket1->Socket->Connections[ComboBox1->ItemIndex]->RemoteAddress+" wurde gebannt.*");
            ServerSocket1->Socket->Connections[ComboBox1->ItemIndex]->Close();
            ScrollDown(RichEdit1);
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::Button8Click(TObject *Sender)
    {
            for(int i=0;i<=BanCount;i++)
            {
                    if(Banlist[i]==ComboBox2->Text && ComboBox2->Text!="")
                            {
                                    Banlist[i]=NULL;
                                    for(int j=0;j<=BanCount;j++)
                                            if(ComboBox2->Items->operator [](j)==ComboBox2->Text)
                                                    ComboBox2->Items->Delete(j);
                                    BanCount--;
                                    RichEdit1->SelAttributes->Style = RichEdit1->SelAttributes->Style << fsItalic;
                                    RichEdit1->Lines->Add("*"+ComboBox2->Text+" wurde entbannt.*");
                                    ScrollDown(RichEdit1);
                                    return;
                            }
            }
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
    {
            if(ServerSocket1->Active)
                    ServerSocket1->Close();
            ShowMessage("HJG-Chat ©2008 by Toddy");
    }
    //---------------------------------------------------------------------------
    

    Client

    //---------------------------------------------------------------------------
    
    #include <vcl.h>
    #pragma hdrstop
    
    #include "Unit1.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    bool leerpost;
    struct data
    {
            char text[500];
            char name[100];
            int type;  //1=Normalpost; 2=Servermeldungen 3=Willkommen 4=PM 5=Nickname 6=Nicknametausch 7=Initialisierung
            char dest[50]; //Für PMs
            char IPList[100][50];
            char NickList[100][100];
    };
    data *paket;
    //---------------------------------------------------------------------------
    void AddMessage(TRichEdit *re,AnsiString name, AnsiString msg)
    {
            re->SelStart=re->Text.Length();
            re->SelAttributes->Style=re->SelAttributes->Style<<fsBold;
            re->SelText="<"+name+">"+":   ";
            re->SelAttributes->Style=re->SelAttributes->Style>>fsBold;
            re->SelText=msg+"\n";
    }
    //---------------------------------------------------------------------------
    void ScrollDown(TRichEdit *re)
    {
            re->Perform(EM_SCROLLCARET,0,0);
            re->SelStart=re->Text.Length();
    }
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::FormCreate(TObject *Sender)
    {
            Memo1->Clear();
            RichEdit1->Clear();
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::ClientSocket1Disconnect(TObject *Sender,
          TCustomWinSocket *Socket)
    {
            RichEdit1->SelAttributes->Style = RichEdit1->SelAttributes->Style << fsItalic;
            RichEdit1->Lines->Add("Du hast den Chat verlassen");
            RadioButton1->Checked=0;
            RadioButton2->Checked=1;
            ComboBox1->Clear();
            ComboBox2->Clear();
            ScrollDown(RichEdit1);
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::ClientSocket1Connect(TObject *Sender,
          TCustomWinSocket *Socket)
    {
    if (ClientSocket1->Active)
    {
            RadioButton1->Checked=1;
            RadioButton2->Checked=0;
            paket->type=5;
            strncpy(paket->name,Edit1->Text.c_str(),sizeof(paket->name));
            ClientSocket1->Socket->SendBuf(&paket,sizeof(paket));
    }
    else
    {
            RichEdit1->Lines->Add("Verbindung fehlgeschlagen");
            RadioButton1->Checked=0;
            RadioButton2->Checked=1;
            ScrollDown(RichEdit1);
    }
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button2Click(TObject *Sender)
    {
            leerpost=true;
            for(int i=1;i<=Memo1->Text.Length();i++)
            {
                    if(Memo1->Text.operator [](i)!=' ')
                    {
                            leerpost=false;
                            break;
                    }
            }
            if(!leerpost)
            {
                    paket->type=1;
                    strncpy(paket->name,Edit1->Text.c_str(),sizeof(paket->name));
                    strncpy(paket->text,Memo1->Text.c_str(),sizeof(paket->text));
                    ClientSocket1->Socket->SendBuf(&paket,sizeof(paket));
            }
            Memo1->Clear();
            ScrollDown(RichEdit1);
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
    {
            if(ClientSocket1->Active)
                    ClientSocket1->Close();
            ShowMessage("HJG-Chat ©2008 by Toddy");
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::Memo1KeyDown(TObject *Sender, WORD &Key,
          TShiftState Shift)
    {
            if(Key==VK_RETURN)
                    {
                            leerpost=true;
                            for(int i=1;i<=Memo1->Text.Length();i++)
                            {
                                    if(Memo1->Text.operator [](i)!=' ')
                                    {
                                            leerpost=false;
                                            break;
                                    }
                            }
                            if(!leerpost)
                            {
                                    paket->type=1;
                                    strncpy(paket->name,Edit1->Text.c_str(),sizeof(paket->name));
                                    strncpy(paket->text,Memo1->Text.c_str(),sizeof(paket->text));
                                    ClientSocket1->Socket->SendBuf(&paket,sizeof(paket));
                            }
                            Memo1->Clear();
                            ScrollDown(RichEdit1);
                    }
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::RadioButton1Click(TObject *Sender)
    {
            struct hostent *h;
            h=gethostbyname("tbteam.dyndns.org");
            ClientSocket1->Host=h->h_name;
            ClientSocket1->Open();
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::RadioButton2Click(TObject *Sender)
    {
            ClientSocket1->Close();
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::Edit1Change(TObject *Sender)
    {
            paket->type=6;
            strncpy(paket->name,Edit1->Text.c_str(),sizeof(paket->name));
            ClientSocket1->Socket->SendBuf(&paket,sizeof(paket));
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
            strncpy(paket->name,Edit1->Text.c_str(),sizeof(paket->name));
            paket->type=4;
            strncpy(paket->text,Memo1->Text.c_str(),sizeof(paket->text));
            strncpy(paket->dest,ComboBox2->Items->operator [](ComboBox1->Items->IndexOf(ComboBox1->Text)).c_str(),sizeof(paket->dest));
            ClientSocket1->Socket->SendBuf(&paket,sizeof(paket));
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::ClientSocket1Read(TObject *Sender,
          TCustomWinSocket *Socket)
    {
            Socket->ReceiveBuf(&paket,sizeof(paket));
            switch(paket->type)
            {
            case 1:
                    AddMessage(RichEdit1,paket->name,paket->text);
                    break;
            case 3:
                    RichEdit1->SelAttributes->Style = RichEdit1->SelAttributes->Style << fsBold << fsItalic;
                    RichEdit1->Lines->Add(paket->text);
                    break;
            case 2:
                    RichEdit1->SelAttributes->Style = RichEdit1->SelAttributes->Style << fsItalic;
                    RichEdit1->Lines->Add(paket->text);
                    break;
            case 4:
                    RichEdit1->SelAttributes->Style = RichEdit1->SelAttributes->Style << fsItalic << fsBold;
                    RichEdit1->Lines->Add(AnsiString("*<")+paket->name+"> (PM): "+paket->text+"*");
                    SetForegroundWindow(Form1->Handle);
                    break;
            case 7:
                    for(int i=0;i<sizeof(paket->IPList);i++)
                            ComboBox2->Items->operator [](i)=paket->IPList[i];
                    for(int i=0;i<sizeof(paket->NickList);i++)
                            ComboBox1->Items->operator [](i)=paket->NickList[i];
                    break;
            }
    
            ScrollDown(RichEdit1);
    }
    //---------------------------------------------------------------------------
    


  • so viel Code und eine Beschreibung die "funktioniert nicht" in den Schatten stellt.
    Welche Exceptions treten denn genau auf? Und wo!

    Edit: Der BCB bringt einen ganz paasabelen Chat zum anschauen und verbessern als Beispiel mit: $(BCB)\Examples\Internet\Chat


Anmelden zum Antworten