サーバソケットで複数のクライアントが接続している場合、メッセージを送信して来たクライアントにのみ、返信したいのですがどの様にすれば宜しいでしょうか。
サーバソケットのDataプロパティーを使えば良いという事は分かったのですが、Connections{i]とDataプロパティーどの様に結びつければよいか分かりません。
ClientReadの中で、Socket->SendTextすれば、そのクライアントに送信できるのは、わかっているのですが、このイベント外で行いたいのです。
DataとConnectionを結びつける方法を教えていただけないでしょうか?
Data:=@Connections[i]
PChar(Data)^:=Connections[i]
下のはPCharじゃないかな
じゃなくてiを関連付ればいいのかな
PInteger(Data)^:=i
間違ってても責めないでください
るるとん@Kさん返答有難うございます。
うまく、いきません。
皆さんは特定のクライアントを探し出す場合、FOR
文でぐるぐる回して、Connectios[i]に一致するiを毎回探しだしているのでしょうか?
OnClientConnectでDataプロパティーを利用すれば、うまく出来そうな気がするのですが。
Connectios[i]は何型ですか?
Dateに数値を入れる場合
PInteger(Data)^:=数値
PInteger(Data)^でDataの内容が使えます
CustomWinSocketへのポインタです
プログラムはBuilder5で作成しているのですが、良い提示板が見つからず
ここで質問させていただいています。
例えば、クライアントに接続する前にそのクライアントのハンドル名を
Edit1に書き込んでおいて、それをDataに保存。
クライアントの誰か1人に返信する時は、例えばEdit2にそのハンドル名を入れておいて…
type
TClientData = class
Name : string;
....
end;
procedure TForm1.ServerSocket1ClientConnect(Sender: TObject; Socket: TCustomWinSocket);
var
cd : TClientData;
begin
cd := TClient.Create;
cd.Name := Edit1.Text;
Socket.Data := cd;
...
end;
procedure TForm1.SendMessageToUser(msg : string);
var
i : Integer;
cd : TClientData;
begin
for i:=0 to ServerSocket1.Socket.ActiveConnections - 1 do begin
cd := TClientData(ServerSocket1.Socket.Connections[i].Data);
if cd.Name = Edit2.Text then ServerSocket1.Socket.SendText(msg);
end;
end;
患者さ〜ん 有難うございました。おかげで、何とか解決しそうです。
サーバソケットで、クライアントの上限数を設けるばあいは、ClientConnectイベントで、ActiveConnectionを上限に達していれば、そのSocketをClientConnectイベントでCloseしてしまう等やればよいのでしょうか?
ClientConnect中に書くのは間違っている気がするのですが。。。
みなさん、本当に親切に教えて頂きありがとうございます。
ありがとうございました。何とか解決することができました。
ツイート | ![]() |