TClientSocket Problem !
-
Hallo,
ich habe eine Client Anwendung und eine Server Anwendung geschrieben. Das Programm ist vom Aufbau ähnlich aufgebaut wie miRC nur das man momentan erst in einem Channel chatten kann.Ich habe es nun folgendermaßen versucht zu lösen.
Sobald der Client zum Server connected sendet er im folgende Zeichenfolge:
ClientSocket->Socket->SendText('n' + NickName);
Der Server prüft nun immer auf den ersten Buchstaben ab bei 'n' ist z.B. ein Client gejoint.
Der neu gejointe Nick wird dann vom Server wieder an alle Clients gesendet und das Listenfeld wo die Nicks gelistet werden wird Aktualisiert. Nun gibt es nur das Problem das der Client die Nicks hintereinander und nicht untereinander im Listenfeld listet. Kann es sein das ich da den Puffer löschen muss?
Wenn ja wie geht das?Ereignis des Clients OnConnected:
//Message vom Server empfangen
getText = ClientSocket->Socket->ReceiveText(); char *pruef = getText.c_str(); if(pruef[0] == 'n') { //Nickname //getText.Delete(1,1); chan_zg[0]->lstUserlist->Items->Add(getText); ClientSocket->Free(); } else if(pruef[0] == 'l') //Löschbefehl chan_zg[0]->lstUserlist->Clear(); else if(pruef[0] == 'm') //Message //getText.Delete(1,1); chan_zg[0]->memChat->Lines->Add(getText);Ereignis OnClientRead des Servers: for(x=0;x<client_anz;x++) { //Message aus jeder Verbindung lesen re_message[x] = server_socket->Socket->Connections[x]->ReceiveText(); char *pruef = re_message[x].c_str(); //Prüfen auf Client connect if(pruef[0] == 'n') { nick[x] = re_message[x]; //Nick am Server löschen list_user->Clear(); //Nick am Server listen for(x=0;x<client_anz;x++) { list_user->Items->Add(nick[x]); } //Löschbefehl senden for(x=0;x<client_anz;x++) { server_socket->Socket->Connections[x]->SendText("l"); } //An jeden Client alle Nicks senden for(x=0;x<client_anz;x++) { for(y=0;y<client_anz;y++) { server_socket->Socket->Connections[x]->SendText(nick[y]); }//ENDE FOR Y VERSCHACHTELT }//ENDE FOR X VERSCHACHTELT }//ENDE IF //Prüfen auf Client disconnect else if(pruef[0] == 'd') { //Prüfen welche Connection ist disconnected for(int i=0; i<server_socket->Socket->ActiveConnections; i++) { if(server_socket->Socket->Connections[i]->SocketHandle == Socket->SocketHandle) { //Nick am Server löschen list_user->Clear(); //Nick am Server listen for(x=0;x<client_anz;x++) { list_user->Items->Add(nick[x]); } //Löschbefehl senden for(x=0;x<client_anz;x++) server_socket->Socket->Connections[x]->SendText("l"); //An jeden Client alle Nicks senden for(x=0;x<client_anz;x++) { for(y=0;y<client_anz;y++) { server_socket->Socket->Connections[y]->SendText(nick[x]); } }//ENDE FOR X VERSCHACHTELT }//ENDE IF VERSCHACHTELT }//ENDE FOR I }//ENDE ELSE IF //Prüfen auf Message else if(pruef[0] == 'm') { //An jeden Client alle Messages senden for(y=0;y<client_anz;y++) { server_socket->Socket->Connections[y]->SendText(re_message[x]); }//ENDE FOR Y VERSCHACHTELT }//ENDE ELSE IF }//ENDE FOR X }
-
a) Was heisst "hintereinander statt untereinander"? Mach mal ein Beispiel
b) Ich war mir sicher, dass es - gemäss VCL-Doku - verboten ist, Free eines Elements direkt aufzurufen.-junix
-
Auh das Free gehört da nicht rein das war nur ein Versuch von mir.
Also mit Hintereinander mein ich: Nick1Nick2
Untereinander: Nick1
Nick2
-
Ist es möglich, dass es sich bei dem Problem um die Problematik die in der FAQ unter "Protokollentwicklung" erwähnt wird handelt?
-junix
-
Ja, würde Junix da zustimmen so wie ich es verstanden habe hast du das Problem der Protokollierung hast...
D.H. Du sendest 2x der Server empfängt das ganze aber mit einem rutsch empfängt aber les dir die ganzen Threads hier im Forum dazu mal durch....
P.S. viel SpaZ

-
Genauso ist es: Wenn du Pech hast, empfängst du auch:
Nick1N
ick2Je nachdem, wie schnell die Rechner sind. Du kommst alo um ein Protokoll nicht herum.
Rob'