用WINSOCKET编程,当有多个客户连接时,服务器对客户请求作回应.
问题:当有多个客户连接时,如何才可以把某客户的请求结果发回给某客户?而不会发给其它客户?
问题:当有多个客户连接时,如何才可以把某客户的请求结果发回给某客户?而不会发给其它客户?
解决方案 »
- 用api代替TSimpleEvent不知道为什么没有效果
- 新手求教(100分相送) 怎么在每次单击一个按钮事件里面创建一个新线程???
- fastreopt
- Delphi7工程转回Delphi5的问题
- ★★★★★★★★★★★★ 几个函数给大家,不知道的UP一下 ★★★★★★★★★★★★
- 运行时显示‘参数错误’是怎么回事?
- TDbgrid问题:能否只能让它修改数据,不能添加记录?
- 请进。。。。。。。。。。。
- 急!请问delphi中定制报表的方法,letter 8 1/2X11in纸的一半,套打数据内容
- 一个有关用dbgrid显示数据库查询结果的问题
- 请大家帮忙推荐好的打包软件,高分回报!
- 如何截获windows的关机消息呢?我实验了一个,不管用~
http://expert.csdn.net/Expert/topic/2984/2984616.xml?temp=.7877924
procedure TForm1.Button1Click(Sender: TObject);
var
i : integer;
sock : TCustomWinSocket;
begin
for i :=0 to ServerSocket1.Socket.ActiveConnections - 1 do
begin
sock := ServerSocket1.Socket.Connections[1];
if sock.RemoteHost = '192.168.0.88' then
begin
sock.SendText('hello');
end;
end;
end;试看看。
ServerSocket1:
for i=0 to i<ServerSocket.Socket.ActiveConnections
begin
ServerSocket.Socket.Connections[i].SendText("abcd{"+发送对象+";"+发送的内容);
end;ClientSocket1的OnRead事件
String sText = Socket.ReceiveText();
根据前面的abcd{+发送对象的判断,将内容在哪个客户端显示出来
说真的,你们的每一种方法都不行,过不到要求.
因为可能存在同一台机运行多个线程实例的情况.
我把我的内容公布下,大家共进吧.
创建一个链表,用于动态记录连接:
struct Myconn {
int conn;
void *shandle;
TCustomWinSocket *Client;
Myconn *next;};
在ServerSocket1ClientConnect当有连接时,则保存连接句柄..
//把连接信息放在链表中
ss=ServerSocket1->Socket->ActiveConnections;
myconn=new Myconn;
myconn->conn =ss-1;
myconn->shandle=Socket->Handle ;
myconn->Client=ServerSocket1->Socket->Connections[ss-1];
myconn->next=NULL;
if (ss==1) { //设立头指针
head=new Myconn;
head->conn=-1;
head->shandle =0;
head->next =myconn;}
else {
s=head;
for (s=head;s->next!=NULL;s=s->next);
s->next=myconn;
}
在回发信息时,根椐系统提供的句柄,查看链表.然后发送..
for (s=head;s->shandle!=Socket->Handle && s!=NULL; s=s->next);
if (s->shandle==Socket->Handle) {
Client=s->Client;
try
{ Client->SendText(Msg); }
catch ( ... )
{
Memo1->Lines->Add("出现异常,正在处理,如果不能正常通讯,请关闭本程序再运行");
}
}
在客户端退出时,释放链表..
for (p=head,s=head;s->shandle!=Socket->Handle && s!=NULL; s=s->next)p=s;
if (s->shandle==Socket->Handle) {
if (s->next==NULL) {p->next=NULL;
sorder=s->conn;
delete s;}
else {p->next=s->next;
sorder=s->conn;
delete s;} }
else ShowMessage("释放内存失败!");
当服务器关闭时,释放所有链表.. //释放所有链表
for (;;) {
if (head==NULL) break;
for (p=head,s=head;s!=NULL; s=s->next)p=s;
p->next=NULL;
delete s;
if (p==head) {delete p;break;}
}呵呵,虽然有点复杂,但很有效.
谁要源程序的,可向给我发邮件.
我太穷了,但是还是要结帐的,谁可给点分我??