学socket编程,如何求知从连接的socket中的IP,谢谢

解决方案 »

  1.   

    accept 的时候 会返回 客户端 socks 的地址信息 保存在结构 sockaddr 中。
    ==============================
    accept 原型SOCKET accept(
      SOCKET s,
      struct sockaddr* addr,
      int* addrlen
    );=======================
    sockaddr 结构struct sockaddr_in {
            short   sin_family;
            u_short sin_port;
            struct  in_addr sin_addr;
            char    sin_zero[8];
    };
    struct sockaddr_in6 {
            short   sin6_family;
            u_short sin6_port;
            u_long  sin6_flowinfo;
            struct  in6_addr sin6_addr;
            u_long  sin6_scope_id;
    };
    struct sockaddr_in6_old {
            short   sin6_family;        
            u_short sin6_port;          
            u_long  sin6_flowinfo;      
            struct  in6_addr sin6_addr;  
    };
      

  2.   


    SOCKET accept(
      SOCKET s,
      struct sockaddr* addr,
      int* addrlen
    );
    ConnAddrs为accept函数中addr参数:CString s_tempIP;
    s_tempIP.Format("%d.%d.%d.%d",ConnAddrs.sin_addr.S_un.S_un_b.s_b1,ConnAddrs.sin_addr.S_un.S_un_b.s_b2,ConnAddrs.sin_addr.S_un.S_un_b.s_b3,ConnAddrs.sin_addr.S_un.S_un_b.s_b4);
      

  3.   

    这只是阻塞方式用accept来获得的,当然容易了。但楼主问的是如何通过一个连接的套接字获取IP。假如人家是acceptEx()建立联接的呢?
      

  4.   

    TO楼主,刚找了一下。这个函数可以实现
    int getpeername (
      SOCKET s,                    
      struct sockaddr FAR*  name,  
      int FAR*  namelen            
    );
      

  5.   

    在你accept返回的struct sockaddr-in (比如叫A)中有个属性叫sin_addr你用inet_ntoa(A.sin_addr)就是你要的IP地址!