求助高手,如何使用双网卡进行UDP多播? 局域网中每台机器都有两块网卡,如何指定网卡进行通信呢?(UDP多播)经实验发现系统总是选择默认的那个网卡发送数据包,而另一个网卡闲着,如何能让两块网卡分工呢?请高手们帮忙解答!! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 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);} MulticastIp.imr_interface.s_addr = mdLocalIP;//网卡的IP地址 绑定IP肯定是不行的,跟绑定网卡是两码事,我试试xlzxlich(阳光)的方法 //将套接字绑定到用户指定端口及默认的接口 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)); 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);} 刚进公司,该用怎样的一个流程处理分配的任务? vista下vs2005开发稍描进程时的代码问题 RTSP如何支持直播(语音) Richedit数据读写问题! 如何定义一个带参数构造函数的成员对象? 急!!VC调试出错,请高手指教。急!!!! 怎么在列表框中同时删除多个选项??? vc中运用access数据库显示的问题????谁解决 绝对给分 去哪里找一些好的Vc的实例呢 在vc++里如何用AnimateWindow API? 求助,有关CDataExchange类中成员m_pDlgWnd,PrepareCtrl(),PrepareEditCtrl()的使用 SSL的证书问题
// 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);
}
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));
{
//初始化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);
}