多网卡组播发送的问题,高手指点?

buffaloox 2011-09-29 11:10:15
我的电脑上装了两个网卡。一个有线网卡,一个无线网卡。
现在想实现,选择指定网发送组播数据。
我实现的方法是:组播绑定的的时候,指定网卡的Ip,加入组播是也是指定网卡ip的。
问题出现了:选择有线网卡的ip时,能够发送组播数据,也是收到组播数据。指定无线网卡的ip时,组播数据发送不了。


另外我的测试,禁用有线网卡,绑定和加入组播时都用INADDR_ANY。能够发送也能接收。

下面是部分代码

BOOL XXXX::Open(PIP_ADAPTER_INFO pAdapter)
{
int iRet;
m_nSocket = socket(AF_INET, SOCK_DGRAM, 0);
if (m_nSocket == INVALID_SOCKET)
{
return FALSE;
}

const int routenum = 255;//10;
iRet = setsockopt(m_nSocket, IPPROTO_IP, IP_MULTICAST_TTL, (char*)&routenum, sizeof(routenum));
if (iRet == SOCKET_ERROR)
{
closesocket(m_nSocket);
return FALSE;
}

const int loopback = 1; //1/0:允许/不允许回馈
iRet = setsockopt(m_nSocket, IPPROTO_IP, IP_MULTICAST_LOOP, (char*)&loopback, sizeof(loopback));
if (iRet == SOCKET_ERROR)
{
closesocket(m_nSocket);
return FALSE;
}

SOCKADDR_IN saUdpCli;
memset((char *)&saUdpCli, 0, sizeof(saUdpCli));

m_bFind = FindIp(pAdapter, m_strIp);
saUdpCli.sin_family = AF_INET;
if (m_bFind)
{
saUdpCli.sin_addr.s_addr = inet_addr(m_strIp);
}
else
{
saUdpCli.sin_addr.s_addr = htonl(INADDR_ANY);
}


saUdpCli.sin_port = htons(BROADCAST_RECV_PORT);
iRet = bind(m_nSocket, (SOCKADDR *)&saUdpCli, sizeof(SOCKADDR_IN));
if (SOCKET_ERROR == iRet)
{
::MessageBox(NULL, "bind failure", "SearchDVS", MB_OK);
closesocket(m_nSocket);
return FALSE;
}

ip_mreq mreq;
memset(&mreq, 0, sizeof(mreq));
if (m_bFind)
{
mreq.imr_interface.S_un.S_addr = inet_addr(m_strIp);//htonl(INADDR_ANY);
}
else
{
mreq.imr_interface.S_un.S_addr = htonl(INADDR_ANY);
}
mreq.imr_multiaddr.S_un.S_addr = inet_addr("224.0.1.10");

//加入一个多播组
iRet = setsockopt(m_nSocket, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char*)&mreq, sizeof(mreq));
if (iRet == SOCKET_ERROR)
{
::MessageBox(NULL, "add multicast(224.0.1.10) failure", "SearchDVS", MB_OK);
closesocket(m_nSocket);
return FALSE;
}

return TRUE;
}


BOOL XXXX::Send()
{
CPacket packet;
const char *pszBuffer;
int iBufferSize;
SOCKADDR_IN servAddr;

pszBuffer = packet.Packet(PARAM_REQUEST, 0, NULL, 0, iBufferSize);

memset(&servAddr, 0, sizeof(SOCKADDR_IN));
servAddr.sin_family = AF_INET;
servAddr.sin_addr.s_addr = inet_addr("224.0.1.10");
servAddr.sin_port = htons(BROADCAST_SEND_PORT);

if (m_bFind)
{
unsigned long addr = inet_addr(m_strIp);
setsockopt(m_nSocket, IPPROTO_IP, IP_MULTICAST_IF, (char *)&addr, sizeof(addr));
}
int iLen = sendto(m_nSocket, pszBuffer, iBufferSize, 0, (sockaddr *)&servAddr, sizeof(SOCKADDR_IN));
return TRUE;
}
...全文
442 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
ljn398431 2011-10-11
  • 打赏
  • 举报
回复
帮顶下
buffaloox 2011-10-07
  • 打赏
  • 举报
回复
自己顶下!!!!!!
buffaloox 2011-09-29
  • 打赏
  • 举报
回复
另外注明:两个网卡分别在不同的网段内。

18,357

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧