请教一个问题: c++ winsock connect()方法 会发3步握手的包,假如我一个网卡最先有一个地址,后来我又在高级里面手动加了2个地址 比如最先网卡地址是192。168。2。11 ,后来我又加了 192。168。2。12 和192。168。2。13这2个地址给这个网卡,这样这个网卡就有3个地址了 但是我发现每次connect()发包都是通过192。168。2。11这个地址出去的。 但是我用 gethostbyname 里面的h_addr_list[i]只能得出这3个地址,得不到优先级 请问那connect()怎么知道哪个地址才是发包的地址呢?如何用程序得出这个地址呢? 如何才能让我的程序得出,哪个是真正用的connect()用的地址呢   也就是说如何才能知道 h_addr_list[i] 里面的3个地址中  192。168。2。11 才是  发包的源地址呢  谢谢大家  肯定 多多給分

解决方案 »

  1.   

    可以在服务端通过sin_addr获取这个真正的地址
      

  2.   

    connet时应该指定了对方的Ip和端口吧,这样才能建立socket链接。一个socket链接分配一个句柄,发送数据时就知道是哪个ip了
      

  3.   

    char strIP[16];
    struct sockaddr_in sockadd;
    int FAR namelen = sizeof(struct sockaddr_in);
    getsockname(m_hSocket, (struct sockaddr *)&sockadd, &namelen);
    strcpy(strIP, inet_ntoa(sockadd.sin_addr));
    在connect之后使用上面的语句在客户端就能在strIP中得到实际使用的IP
      

  4.   

    struct sockaddr_in addr;
    struct hostent *hp;

    addr.sin_family=AF_INET;
    addr.sin_port=htons(port);
    hp=gethostbyname("localhost");
    memcpy((char *)&addr.sin_addr,(char *)hp->h_addr,hp->h_length);         h_addr是h_addr[0]
      

  5.   

    同意DentistryDoctor(不在无聊中无奈,就在沉默中变态) ( )
      

  6.   

    不知道你说“如何才能让我的程序得出,哪个是真正用的connect()用的地址呢”是什么意思,如果是TCP的,那必然有accept。
    SOCKET accept (
      SOCKET s,                   
      struct sockaddr FAR* addr,  
      int FAR* addrlen            
    );
    在addr里就会有这次通讯的地址了,发个包回来不就知道了?
      

  7.   

    你可以在connect前用bind显式指定用本机的哪个IP哪个端口去连接服务端,就像 DentistryDoctor(不在无聊中无奈,就在沉默中变态)  说的那样至于你问的这种情况下 connect 怎么知道用哪一个,我想应该是它获取到的第一个,也就是说很可能就是 addr_list[0]
      

  8.   

    在h_addr_list中是一个地址列表,应该是用的第一个吧。