如何在TServerSocket的OnClientRead事件中确定Socket是TServerSocket.Socket.Connections[Index]

  • 主题发起人 主题发起人 delete
  • 开始时间 开始时间
D

delete

Unregistered / Unconfirmed
GUEST, unregistred user!
如何在TServerSocket的OnClientRead事件中确定Socket是TServerSocket.Socket.Connections[Index]中的那一个.(100分)<br />本人在编一数据通讯的程序但不知
如何在TServerSocket的OnClientRead事件中确定下面的Socket
procedure TForm.ServerSocketClientRead(Sender: TObject;
&lt;strong&gt;Socket&lt;/strong&gt;: TCustomWinSocket);
begin
end;

是TServerSocket.Socket.Connections[Index]中的那一个.
烦劳各位Help!
 
var i:integer;
begin
for i:=0 to ServerSocket1.Socket.ActiveConnections do
if socket=ServerSocket1.Socket.Connections then
break;
i就是index!
 
你不觉的这样太慢吗?
有没有更好的方法。
 
请看:
TServerClientWinSocket:

TServerClientWinSocket describes the server endpoint of a socket
connection to a client socket.

Unit

scktcomp

Description

TServerClientWinSocket is used by server socket components to manage
the Windows socket API calls for the socket connection to an
individual client socket. TServerClientWinSocket objects are created
when a client socket connection is accepted by a listening server
socket.

Applications can create and customize the properties of a
TServerClientWinSocket object in an OnGetSocket event handler for a
server socket component. Component writers can create descendants of

TServerClientWinSocket that may be substituted for
TServerClientWinSocket in the OnGetSocket event handler.

再看看:
TServerClientWinSocket.ServerWinSocket.Connected...

and so on...

 
呵呵, 这样也慢?!
只有一个FOR循环, 难道你有10000个连接么? 一抬普通的服务器能有3,50个
连接就不错了.
 
采用循环的方法是不太好!
 
delete兄大概想要再回发信息给发给你信息的那个socket吧?
其实就用这个参数发送!Socket参数就是那个ClientSocket。
Socket.SendBuf(...);
就可以了。
 
我想为每个连接创建一幅图象,再根据发送过来的数据控制
图象的位置,所以我想知道TServerSocket的OnClientRead
事件中的Socket是TServerSocket.Socket.Connections[Index]
中的那一个。
 
你可以先定义一个数组:
VAR
MyClientSocket:array[0..N]of TCustomWinSocket;
在TServerSocket的&lt;font Color="#ff0000"&gt;OnAccept&lt;/font&gt;事件里
MyClientSocket[x]:=Socket;
并记住MyClientSocket[x]对应哪幅图(这应该自己处理吧)。

在以后的&lt;font Color="#ff0000"&gt;OnClientRead&lt;/font&gt;事件里,
var i:integer;
begin
for i:=0 to ServerSocket1.Socket.ActiveConnections do
if socket=MyClientSocket then
break;
参数&lt;font Color="#ff0000"&gt;Socket&lt;/font&gt;即是MyClientSocket
根据&lt;font Color="#ff0000"&gt;Socket&lt;/font&gt;的数据处理MyClientSocket对应的那幅图。

这和cytown的方法原理一样。用循环并不影响效率:
socket=MyClientSocket的比较是内存中的比较,不是找各个连
接。你的连接数能大到什么地步?
 
同意使用循环.
但对用for循环保留意见. break之后i不一定准. 最保险用while循环.
 
能不能通过socket.data进行处理.
我的连接最少也要超过200多.
 
没必要. 就是delphi自己有关list的搜索(indexof,...)也都是用循环的.
 
循环200次很快的,要知道从操作系统到应用程序里到处都是
循环语句。
 
多人接受答案了。
 
后退
顶部