我在用TCP编程时,当客户机发出的connect时我保存了所有与服务器连接的客户机的SOCKADDR信息,当客户机断开连接时,会发出FD_CLOSE事件,我想接到这个事件后,知道是哪一台机子,断开的连接,也就是知道断开的连接的客户机的SOCKADDR信息。

解决方案 »

  1.   

    1)如果用socket编程,那么可以在accept中添加用于接收客户机ip和port的结构,用NULL就忽略了
    2)如果用winsock,可以用receivefrom中的形参中返回。
      

  2.   

    SOCKET accept(
      SOCKET s,
      struct sockaddr FAR *addr,          //这是一个指向sockaddr结构的指针
      int FAR *addrlen
    );struct sockaddr theclient;
    accept( thesocketfd, &theclient, sizeof( struct sockaddr ) );struct sockaddr {
      u_short    sa_family;
      char       sa_data[14];
    };   struct sockaddr_in {
            short   sin_family;
            u_short sin_port;
            struct  in_addr sin_addr;
            char    sin_zero[8];
    };一切信息都可以从这里得到。
      

  3.   

    你将socket放入一个结构中如:
    typedef struct
    {
       SOCKET  sock;
       char    IP[10];
    }SOCKSTRUCT;
    当执行closesocket后可取得socket的头地址然后将地址加上sizeof(SOCKET)就可得到IP的头地址
      

  4.   

    naile,还是有一点, 不明白,当客户机关闭套接字时,服务器不一定也要关闭套接字,这时我怎么从服务器上知道客户机的地址,即服务器收到了客户机的FD_CLOSE消息后,在应该怎么做,得到客户机的地址。谢谢!!
      

  5.   

    server getpeernameclient getsocknameinet_ntoa
      

  6.   

    我想如果有多个连接的话,用每一个SOCKET对一个IP做一个表,类似NAIL的做法,另外FD——CLOSE收到时会知道是哪个SOCKET的(如果用WSAEVENSELECT模式的话)不知讲得对不,不对的请谅。
      

  7.   

    用wsaasyncselect函数应该可以,
    FD_CLOSE              Want to receive notification of socket closure
      

  8.   

    同意 ritch的然后再用循环查找的方法从保存的套接字和IP的结构体中,找到那台下线的机子