AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi problem mit tserversocket - sendtext client-id
Thema durchsuchen
Ansicht
Themen-Optionen

problem mit tserversocket - sendtext client-id

Ein Thema von painrestricter · begonnen am 12. Nov 2009 · letzter Beitrag vom 13. Nov 2009
Antwort Antwort
painrestricter

Registriert seit: 2. Nov 2009
43 Beiträge
 
#1

problem mit tserversocket - sendtext client-id

  Alt 12. Nov 2009, 14:08
servuß

ich bin dabei einen kleinen chat zu schreiben, wie wahrscheinlich jeder am anfang ^^

funktioniert auch schon soweit alles, verbindung steht, text kann gesendet werden usw.
ABER: ich kann nur vom clienten zum server eine nachricht schicken, aber nicht vom server zum clienten.

ich such das problem jetzt schon die ganze zeit, kanns aber nicht finden.

Wenn ich vom server aus eine nachricht(bzw nen text) zum clienten schicken will, kommt:

Windows-Socket-Fehler: Eine anforderung zum senden oder empfangen von daten wurde verhindert, da der socket nicht verbunden ist und (beim senden über einen datagrammsocket mit sento-aufruf) keine adresse angegeben wurde (10057), auf API 'send' wtf? die verbindung steht aber.

hier mal der source vom server:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
serversocket1.Active := true;
serversocket1.Port := strtoint(edit1.text);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
memo1.clear;
edit1.text := '6900';
memo1.lines.add('----Welcome----');
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
serversocket1.Active := false;
Application.Terminate;
end;

procedure TForm1.ServerSocket1ClientError(Sender: TObject;
  Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
  var ErrorCode: Integer);
begin
showmessage('An Error occurred while connecting, try again');
errorcode := 0;
end;

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
// nur zahlen erlauben
if not (key in ['0'..'9', char(vk_back)]) then
 key := #1;
end;

procedure TForm1.ServerSocket1ClientConnect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
Memo1.Lines.add('Connected: welcome :) ');
Memo1.lines.add('-------------------');
end;

procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
begin
memo1.lines.Add(socket.ReceiveText);
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
serversocket1.Socket.SendText(edit2.text);
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
serversocket1.Close;
end;

procedure TForm1.ServerSocket1ClientDisconnect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
memo1.lines.add('status: Disconnected');
end;

procedure TForm1.Button5Click(Sender: TObject);
begin
MessageDlg('blabla', mtInformation , [mbOK] ,0);
end;

end.
ich bedanke mich jetzt schon für die hilfe
gruß
  Mit Zitat antworten Zitat
fui-tak

Registriert seit: 24. Okt 2008
117 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: problem mit tserversocket

  Alt 12. Nov 2009, 14:44
Hallo,
Ich glaube ich habe dein Problem gefunden

Um Daten vom Server zum Client zu schicken, muss man angeben an welchen Client die Daten sollen. Ein Server kann ja mehrere Clients haben. Das funktioniert dann so:
ServerSocket1.Socket.Connections[0].SendText('Hallo Welt'); In die eckigen Klammern kommt die Nummer des Clients rein, die Zählung fängt bei 0 an
  Mit Zitat antworten Zitat
painrestricter

Registriert seit: 2. Nov 2009
43 Beiträge
 
#3

Re: problem mit tserversocket

  Alt 12. Nov 2009, 15:32
fuitak, ich liebe dich

danke, jetzt gehts

wie kann ich dem clienten eine spezielle id zuweisen?
spontan fällt mir da vielleicht das ein

var id: array [0..10] of integer;
  Mit Zitat antworten Zitat
uoeb7gp
(Gast)

n/a Beiträge
 
#4

Re: problem mit tserversocket

  Alt 12. Nov 2009, 15:36
Hi, außerdem ist die Übermittlung des Textes nur solange sicher, solange der gesamte Text auf einmal in den Empfangsbuffer
des Empfänger Sockets paßt, also nicht in mehreren Stücken übermittelt werden muß.
Deshalb brauchst Du auch noch einen Daten-Header, der die Längeninfos des übermittelten Textes enthält.

Als Beispiel:

{GENERIC HEADER}
//-- Headeraufbau MsgID = Byte = 0..255; Msg-Length = DWORD

//-- +--------------------|--------------------------|----------------+
//-- | Byte-MsgID | 4Byte-DWORD Msg-Length | Daten |
//-- +--------------------|--------------------------|----------------+

Der Empfänger Socket, extrahiert beim Empfangen die ersten 5 Bytes aus der Message, und liest
Solange aus dem Socket bis alle Daten übertragen wurde.
  Mit Zitat antworten Zitat
fui-tak

Registriert seit: 24. Okt 2008
117 Beiträge
 
Turbo Delphi für Win32
 
#5

Re: problem mit tserversocket

  Alt 12. Nov 2009, 15:39
Zitat von painrestricter:
wie kann ich dem clienten eine spezielle id zuweisen?
spontan fällt mir da vielleicht das ein
var id: array [0..10] of integer;
Also diesen Index, den man in "ServerSocket1.Socket.Connections[0].SendText('Hallo Welt');" reinschreibt kann man einen Client nicht zuweisen, den bekommt er automatisch.
Der erste angemeldete Client bekommt Nummer 0, der zweite bekommt die 1 usw.
Wenn sich dann z.B. der erste Client abmeldet, dann bekommt der ursprünglich zweite die Nummer 0, es wird also nachgerückt

So jetzt muss ich aber los, also erstmal viel Spaß hiermit
  Mit Zitat antworten Zitat
uoeb7gp
(Gast)

n/a Beiträge
 
#6

Re: problem mit tserversocket

  Alt 12. Nov 2009, 15:42
Im Read der Komponente kriegst alles mit wast brauchst!

Delphi-Quellcode:
procedure TServerObj.ServerSocketClientRead(const Sender: TObject;
  const Socket: TCustomWinSocket);
var
  cbRcv: integer;
  RcvBuf: array [0..WSOCK_READ_BUFFER_SIZE * 8] of Byte;
  RcvBufItem: TRcvBufItem;
  hMemData: hGlobal;
  hMemStruct: hGlobal;
begin
  cbRcv := Socket.ReceiveBuf(RcvBuf[0], WSOCK_READ_BUFFER_SIZE * 8);
  if cbRcv <= 0 then EXIT;

  if Socket.SocketHandle <= 0 then EXIT;

  hMemData := GlobalAlloc(GMEM_FIXED, cbRcv);
  move(RcvBuf[0], Pointer(hMemData)^, cbRcv);

  hMemStruct := GlobalAlloc(GMEM_FIXED, SizeOf(TRcvBufItem));

  RcvBufItem.ptrData := Pointer(hMemData);
  RcvBufItem.cbData := cbRcv;
  RcvBufItem.Socket := Socket.SocketHandle;
  RcvBufItem.hMemStruct := hMemStruct;
  RcvBufItem.hMemData := hMemData;

  move(RcvBufItem, Pointer(hMemStruct)^, SizeOf(TRcvBufItem));

  if FRecvBuffer.Write(Pointer(hMemStruct), SizeOf(TRcvBufItem)) <>
    SizeOf(TRcvBufItem) then
  begin
    FRecvBuffer.SetBufSize((FRecvBuffer.BufSize + cbRcv) * 2);
    FRecvBuffer.Remove(SizeOf(TRcvBufItem));
    if FRecvBuffer.Write(Pointer(hMemStruct), SizeOf(TRcvBufItem)) <>
      SizeOf(TRcvBufItem) then
        raise exception.Create('you should never see this');
  end;
  
  SetEvent(FMsgDispatchEvent);
end;
  Mit Zitat antworten Zitat
fui-tak

Registriert seit: 24. Okt 2008
117 Beiträge
 
Turbo Delphi für Win32
 
#7

Re: problem mit tserversocket

  Alt 12. Nov 2009, 18:00
Hui der Code sieht aber sehr kompliziert aus... und da unser guter painrestricter, zumindest in Sachen Socket-Programmierung, noch Neuling ist, wäre es doch eigentlich schön mal zu sagen, was diese Methode eigentlich genau macht
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#8

Re: problem mit tserversocket

  Alt 12. Nov 2009, 18:13
@painrestricter: Könntest du deinem Beitrag bitte einen aussagekräftigeren Titel geben? Das es sich um ein Problem handelt sagt bereits das gewählte Forum aus und "TServersocket" sagt nicht aus was für ein Problem du damit hast.
Ein aussagekräftiger Titel hat den Vorteil das andere mit dem gleichen Problem dieses Thema später über die Suche besser finden und somit hoffentlich auch die Lösung.
Zudem hat es für dich den Vorteil das Leute anhand des Titels sofort wissen ob sie helfen können oder nicht. Nicht jeder hat Zeit alle Themen durchzulesen und wenn der Titel aussagekräftig ist und somit jemand sofort weiß das er helfen kann profitierst du vor allem davon.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
painrestricter

Registriert seit: 2. Nov 2009
43 Beiträge
 
#9

Re: problem mit tserversocket - sendtext client-id

  Alt 12. Nov 2009, 23:19
erledigt, SirThornberry


uoeb7gp, danke für den code, aber wie fui-tak schon sagt, ich kann mit den code weder umgehen noch was damit anfangen. ABER es interessiert mich, also werd ich den mal genauer anschauen.

Könnte ich theoretisch auch das customwinsocket modifizieren?
  Mit Zitat antworten Zitat
uoeb7gp
(Gast)

n/a Beiträge
 
#10

Re: problem mit tserversocket - sendtext client-id

  Alt 13. Nov 2009, 16:05
Also anbei der src.
Es handelt sich dabei um eine Implementierung eines Hocklast-Async Socket Servers.

Features:
send und recv buffered and threaded.

Server und Client DLL wurden auf höchsten Durchsatz und Performance hin ausgelegt.
Gegenüber der damaligen JAVA Implementierung stieg die Performance um nahezu 600% !!!!!

Have a lot of Fun.
Angehängte Dateien
Dateityp: rar asyncclientserver_106.rar (601,2 KB, 73x aufgerufen)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:03 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz