用WINSOCKET编程,当有多个客户连接时,服务器对客户请求作回应.
问题:当有多个客户连接时,如何才可以把某客户的请求结果发回给某客户?而不会发给其它客户?

解决方案 »

  1.   

    WINSOCKET?ClientSocket?TCPClient??
    http://expert.csdn.net/Expert/topic/2984/2984616.xml?temp=.7877924
      

  2.   

    在服务端建立一个数组数据结构,每个元素包含ID和IP,在客户端第一次发送的时候将客户端的标识名和IP发过来,然后向指定用户发送时,在数据结构里查找相应的IP就可以了
    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;试看看。
      

  3.   

    简单的,你它将改一下:
    ServerSocket1:
         for i=0 to i<ServerSocket.Socket.ActiveConnections
         begin
         ServerSocket.Socket.Connections[i].SendText("abcd{"+发送对象+";"+发送的内容);
         end;ClientSocket1的OnRead事件
    String sText = Socket.ReceiveText();
     根据前面的abcd{+发送对象的判断,将内容在哪个客户端显示出来
      

  4.   

    其实,这个问题我已解决很久了,只是没时间上论坛.
    说真的,你们的每一种方法都不行,过不到要求.
    因为可能存在同一台机运行多个线程实例的情况.
    我把我的内容公布下,大家共进吧.
    创建一个链表,用于动态记录连接:
    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;}
               }呵呵,虽然有点复杂,但很有效.
    谁要源程序的,可向给我发邮件.
    我太穷了,但是还是要结帐的,谁可给点分我??