局域网中每台机器都有两块网卡,如何指定网卡进行通信呢?(UDP多播)
经实验发现系统总是选择默认的那个网卡发送数据包,而另一个网卡闲着,如何能让两块网卡分工呢?请高手们帮忙解答!!

解决方案 »

  1.   

    struct ip_mreq MulticastIp;

    // Setup the im_req structure to indicate what group we want to join as well as the interface  
     
    //MulticastIp.imr_interface.s_addr =INADDR_ANY;MulticastIp.imr_interface.s_addr =IPPROTO_IP;MulticastIp.imr_multiaddr.s_addr =dwMulticastGroup;

    if(!SetSockOpt(IP_ADD_MEMBERSHIP, (char *)&MulticastIp, sizeof(MulticastIp), IPPROTO_IP))
    {
             int err = WSAGetLastError();
    sprintf(text, "setsockopt(IP_ADD_MEMBERSHIP) Error !(%d)", err);
    MessageBox(NULL, text, "Error", 0);

    return(-err);
    }
      

  2.   

    MulticastIp.imr_interface.s_addr = mdLocalIP;//网卡的IP地址
      

  3.   

    绑定IP肯定是不行的,跟绑定网卡是两码事,我试试xlzxlich(阳光)的方法
      

  4.   

    //将套接字绑定到用户指定端口及默认的接口 
    memset(&m_sockaddr,0,sizeof(m_sockaddr)); 
    m_sockaddr.sin_family=AF_INET; 
    m_sockaddr.sin_port=htons((USHORT)m_nPort); 
    m_sockaddr.sin_addr.s_addr= inet_addr( m_strLocalIP );//htonl(INADDR_ANY);//
    bind(m_hSocket,(struct sockaddr FAR *)&m_sockaddr,sizeof(m_sockaddr));
      

  5.   

    void main()
    {
    //初始化Winsock
    WSADATA wsadata;
    int ret=WSAStartup(WAVERS,&wsadata);
    if(ret!=0) Error("initialize winsock error"); char* multiaddr="234.5.6.7";//多播组地址
    char* localaddr="192.168.1.88";

    //创建UDP类型套接字
    SOCKET sock=socket(AF_INET,SOCK_DGRAM,0); //使套接字监听本地端口
    sockaddr_in local;
    local.sin_family=AF_INET;
    local.sin_port=htons(3333);
    local.sin_addr.s_addr=htonl(INADDR_ANY);//不须具体指定IP ret=bind(sock,(sockaddr*)&local,sizeof(local));
    if(ret==SOCKET_ERROR) Error("bind error"); //加入多播组
    ip_mreq ipmr;
    ipmr.imr_multiaddr.s_addr=inet_addr(multiaddr);
    ipmr.imr_interface.s_addr=inet_addr(localaddr);//因本机有两个网卡(两个IP),其中只有一个能收到多播数据,这里指定是哪一个
    ret=setsockopt(sock,IPPROTO_IP,IP_ADD_MEMBERSHIP,(char*)&ipmr,sizeof(ipmr));
    if(ret==SOCKET_ERROR) Error("setsockopt error"); //接收数据
    char buf[256];
    sockaddr_in from;
    int len=sizeof(from);
    while(true)
    {
    ret=recvfrom(sock,buf,256,0,(sockaddr*)&from,&len);
    if(ret==0)
    Error("recv len=0");
    else if(ret==SOCKET_ERROR)
    Error("recvfrom error");
    else
    {
    buf[ret]='\0';
    printf("%s[%d]发来:%s\n",inet_ntoa(from.sin_addr),ntohs(from.sin_port),buf);
    }
    } //离开多播组
    setsockopt(sock,IPPROTO_IP,IP_DROP_MEMBERSHIP,(char*)&ipmr,sizeof(ipmr)); //关闭套接字
    closesocket(sock);
    }