求助高手,如何使用双网卡进行UDP多播?

chxywm 2005-07-23 01:36:53
局域网中每台机器都有两块网卡,如何指定网卡进行通信呢?(UDP多播)
经实验发现系统总是选择默认的那个网卡发送数据包,而另一个网卡闲着,如何能让两块网卡分工呢?请高手们帮忙解答!!
...全文
655 点赞 收藏 9
写回复
9 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
alexmayer 2005-12-17
关注!
回复
huyansoft 2005-09-20
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);
}
回复
fisker0303 2005-07-26
可以枚举网卡的吧?
回复
rotus 2005-07-25
//将套接字绑定到用户指定端口及默认的接口
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));
回复
AntonlioX 2005-07-23
帮 up
回复
oyljerry 2005-07-23
指定网卡IP地址来
回复
xlzxlich 2005-07-23
MulticastIp.imr_interface.s_addr = mdLocalIP;//网卡的IP地址
回复
xlzxlich 2005-07-23
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);
}
回复
chxywm 2005-07-23
绑定IP肯定是不行的,跟绑定网卡是两码事,我试试xlzxlich(阳光)的方法
回复
相关推荐
发帖
网络编程
创建于2007-09-28

1.8w+

社区成员

VC/MFC 网络编程
申请成为版主
帖子事件
创建了帖子
2005-07-23 01:36
社区公告
暂无公告