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 AntwortMFG 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