Hallolo zusammen..
Ich bin momentan an einem Schulprojekt für den Infounterricht beschäftigt:
Wir sollen ein Chatprogramm entwerfen..
Soweit so gut, es funktioniert im Standartmodus,
aber bei der Implementierung eines Extrafeatures reagiert Delphi so,
wie ich es nicht erklären kann.
Delphi-Quellcode:
procedure TServer.ssServerClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var Clantag : String;
i : Integer;
begin
Socket.ReceiveBuf(BuffRecord, SizeOf(BuffRecord));
if BuffRecord.Typ = 'Online' //Wenn Client connected, sendet dieser eine Onlinemeldung
then begin //an den Server
i := 0;
while (i < lbClients.Items.Count) and (BuffRecord.Nickname <> lbClients.Items[i])
do Inc(i); //Überprüfung, ob Nickname schon vorhanden ist
if i = lbClients.Items.Count
then begin //Falls nein, Client hinzufügen und Änderung im Netzwerk machen
lbClients.Items.Append(BuffRecord.Nickname);
Clientliste_aktualisieren;
end
else begin //Falls ja, Nachricht an den Client vorbereiten
Buffrecord.Typ := 'Nachricht';
Buffrecord.Nickname := 'Server';
Buffrecord.Clantag := '';
Buffrecord.Text := 'Nickname "' + lbClients.Items[i]+ '" schon vorhanden!';
ssServer.Socket.Connections[ssServer.Socket.ActiveConnections-1].SendBuf(BuffRecord, SizeOf(BuffRecord));
ssServer.Socket.Connections[ssServer.Socket.ActiveConnections-1].Close;
// Socket.SendBuf(BuffRecord, SizeOf(BuffRecord));
// Socket.Close; //Nachricht und Closebefehl senden
end;
end
Und in den letzten zwei bzw vier Zeilen tritt das Problem auf:
Egal an welchen Connections-Index ich den Buf sende, es erhalten ihn alle Clienten (unabhängig ob dort "Connections[ActiveConnections-1", "lbClient.Items.Count" oder ein fester Wert (zB 1) eingetragen ist).
Wenn ich das Close rausnehme, erhält der neue, doppelte Client den Buf sogar zweimal.
Und auch bei Socket.SendBuf und Socket.Close geschied dasselbe, obwohl doch der Socket in der Prozedur eigentlich der sein müsste, von dem die doppelte Anmeldung ausgeht..
Achja, der Closebefehl erreicht immer den richtigen...
Kann mir einer da weiterhelfen?