在socket中,客户端与服务器端建立连接后,服务器端怎么知道是哪台机器与其建立连接的  
就是怎么知道客户端的IP地址?还有socket长连接时候,我怎么时时刻刻的查看客户端与服务器端是否断开了

解决方案 »

  1.   

    Socket.RemoteAddress 
    Socket.RemoteHost
    服务器端可以给连接上的客户端发送测试数据,一定时间内回收到客户端反应的可认为在线.
      

  2.   

    请参考:http://www.programfan.com/article/showarticle.asp?id=2289
      

  3.   

    我用的API,不是用的控件,
    我贴出代码来,麻烦大家给我修改一下吧procedure TForm1.OnWork1Accept(var message: TMessage);
    Var
        Client_Addr: TSockAddr;
        ClientLen: Integer;
        s:string;
    begin
        FillChar(Client_Addr,Sizeof(Client_Addr),0);
        ClientLen := Sizeof(Client_Addr);
        Conn_Socket := Accept(Server_Socket,@Client_Addr,@ClientLen);
    {
         能不能在这里判断出建立的这个  Comm_Socket 是哪台机器建立的,其IP是多少?
    }
        //读取/关闭 事件
        WSAAsyncSelect(Conn_Socket, Form1.Handle, WM_WORK1_READ, FD_READ or FD_CLOSE);
    end;
      

  4.   

    解决了,
    只要 Client_Addr.sin_addr.S_addr 转换成字符串IP就行了   function   IPIntToStr(I:Integer):String;
      var
      sinaddr:in_addr;
      begin
          sinaddr.S_addr:=i;
          result:=String(inet_ntoa(sinaddr));
      end;
      

  5.   

    自己定义活动包探测客户端是否在线,不要用windows的全局活动包检测,至于长连接就是tcp哦。
      

  6.   

    谢谢楼上的 
      还有一个问题啊
      我用API实现socket 能不能让程序既是服务器端,又是客户端  
      

  7.   

    --------------------------------------------------------
     我用API实现socket 能不能让程序既是服务器端,又是客户端  
    --------------------------------------------------------意思是在同一个程序里客户端连接服务器?可以的,多个线程
      

  8.   

    在socketserver的onAccept事件中用Socket.RemoteAddress读取
      

  9.   


    --------------------------------------------------------
     我用API实现socket 能不能让程序既是服务器端,又是客户端  
    --------------------------------------------------------意思是在同一个程序里客户端连接服务器?可以的,多个线程------------------------------------------------------------------------------谢谢!