Autor Beitrag
g1o2k4
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 493



BeitragVerfasst: Di 03.04.07 16:00 
hi zusammen

soweit bin ich bis jetzt gekommen (senden eines bufs vom clienten zum server, nach dem tutorial von dsdt.info), aber wie sende ich einen solchen buf vom server zum clienten ??? kann mir jemand helfen vielleicht mit nem quelltext beispiel ?:
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
  public
    Server: TServerSocket;
    Client: TClientSocket;
    MSG: String;

    { Public-Deklarationen }
  end;

type
  CustomRec = record
    Text: string;
    Zahl:integer;
end;

var
  Form1: TForm1;

implementation

{$R *.dfm}



procedure TForm1.FormCreate(Sender: TObject);
begin
  Memo1.Clear;
end;

procedure TForm1.CheckMSG;
begin
  if MSG = 'Starte Winamp' then shellexecute(handle,'open','C:\Programme\Winamp\Winamp.exe',nil,nil,sw_show);;

end;



procedure TForm1.FormDestroy(Sender: TObject);
begin
    Client.Free;
    Server.Free;
end;

procedure TForm1.ServerClientRead(Sender: TObject; Socket: TCustomWinSocket);
var
  Rec: CustomRec;
begin
 //wir holen unseren Record ab...
  Socket.ReceiveBuf(Rec,SizeOf(Rec));
  //...und übertragen den Inhalt in das MemoFeld
  with Rec do begin
    Memo1.Lines.Add(Text);
    Memo1.Lines.Add(IntToStr(Zahl));
    MSG := Rec.Text;
    CheckMSG;
  end;
end;



procedure TForm1.Button1Click(Sender: TObject);
begin
  Client.Socket.Sendtext(Edit1.Text);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  if (Edit2.Text = 'IP Adresse'or (Edit3.Text = 'Port'then ShowMessage('Bitte IP und Port eintragen')
  else
    begin
  Server := TServerSocket.Create(Form1);
  Memo1.Lines.Add('Server gestartet.');
  Client := TClientSocket.Create(Form1);
  Memo1.Lines.Add('Client gestartet.');
  try
    Server.Port := strtoint(Edit3.Text);
    Server.Open;
    Memo1.Lines.Add('Server hört.');
    Client.Port := strtoint(Edit3.Text);;
    Client.Host := Edit2.text;
    Client.Open;
    Memo1.Lines.Add('Client hört.');
  except
    Client.Free;
    Server.Free;
    Memo1.Lines.Add('Fehler. Client und Server werden geschlossen.');
  end;

  end;
  Server.OnClientRead := ServerClientRead;
end;

procedure TForm1.Button3Click(Sender: TObject);
var
  Rec: CustomRec;
begin
  //Unserem Record werden Werte zugewiesen
  with Rec do begin
    Text := 'Starte Winamp';
    //In Edit2 nur Zahlen eingeben!
    Zahl := 2;
  end;
  //Unser Record wird verschickt!
  Client.Socket.SendBuf(Rec,sizeof(Rec));
end;


end.


danke.

grüße g1o2k4
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Di 03.04.07 16:47 
Moin!

Du kannst keine records mit dynamischen Datentypen versenden, siehe FAQ-Beitrag. :mahn: ;)

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
g1o2k4 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 493



BeitragVerfasst: Di 03.04.07 16:52 
doch es geht:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
Client->Server:
Client.Socket.SendBuf(Rec,sizeof(Rec));

und Server->Client:
Server.Socket.Connections[0].SendBuf(Rec,sizeof(Rec));
//Connection[0] gibt den Clienten an zu dem etwas geschickt werden soll....


beim Clienten muss dann "OnRead" Socket.ReceiveBuf(); eingefügt werdenb und beim Server unter OnClientRead.
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Di 03.04.07 16:59 
Moin!

Ich beziehe mich auf diese Deklaration aus deinem Code oben:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
type  
  CustomRec = record  
    Text: string;  
    Zahl:integer;  
end;


user profile icong1o2k4 hat folgendes geschrieben:
doch es geht:

Nein, es geht nicht; und wenn du den FAQ-Beitrag gelesen hättest, wäre dir sogar klar, warum. ;) (kleiner Tipp: lass dir mal SizeOf(CustomRec) anzeigen und vergleich das mit der Datenmenge, die du wirklich senden willst... :D)

Abgesehen davon: wenn du doch schon weißt, wie´s geht, warum fragst du dann noch... :gruebel:

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
g1o2k4 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 493



BeitragVerfasst: Di 03.04.07 19:46 
ich habs ja erst vorhin herausgefunden.
aber wenn es angeblich nicht geht wieso kommt dann das an was ich gesendet habe ? (ich kann es auch korrekt ausgeben) - keine spur von "das geht nicht"
Fighter#1
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 787

Win XP, Ubuntu 8.04
Turbo Delphi 2006, Delphi 2005 Pe, Delphi 5 Pe, Netbeans 6.1, Eclipse, Microsoft VisualC#, Dev C++, PHP, HTML, CSS
BeitragVerfasst: Di 03.04.07 20:18 
Also bei mir funktioniert der Code wie von die beschrieben, wie Narses es Profeziehen hat NICHT AN!
Die Zahl funktioniert aber der String nicht, is ja auch klar.
Les dir sein bitte FAQ durch!

_________________
Wer andere beherrscht ist stark,
wer sich selbst beherrscht ist mächtig. Lao Tse
g1o2k4 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 493



BeitragVerfasst: Di 03.04.07 21:13 
ok also hab mir die faq jetzt angesehn.
kommt es jetzt also auf die länge des strings an ? wenn man wie beschrieben string[20] einsetzt wird jeder beliebig lange string auf 20 zeichen gekürzt ?
mehr als 10 zeichen will ich eh nicht senden...dafür sollte es doch ohne protokoll gehn oder ?
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Di 03.04.07 21:17 
Moin!

user profile icong1o2k4 hat folgendes geschrieben:
kommt es jetzt also auf die länge des strings an ?

Jain, auf den Datentyp (dynamisch <-> statisch). ;)

user profile icong1o2k4 hat folgendes geschrieben:
wenn man wie beschrieben string[20] einsetzt wird jeder beliebig lange string auf 20 zeichen gekürzt ?

Im Zweifel, weiß ich aber grad nicht genau, was passiert, wenn man mehr als die definierte Menge Zeichen zuweisen will. :? Probier´s halt aus. ;)

user profile icong1o2k4 hat folgendes geschrieben:
mehr als 10 zeichen will ich eh nicht senden...dafür sollte es doch ohne protokoll gehn oder ?

Ja, allerdings hast du dann immernoch dieses Problem hier; und das ist nicht so einfach zu lösen... ;) jedenfalls nicht ohne ein Protokoll... :P

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.