dowhile1
dowhile1
采纳率100%
2016-07-20 08:52

双网段设备的广播如何选择广播网段

9
已采纳

计算机A具有两个网卡, 配置为不同两个网段, 比如IP分别是192.168.0.100, 和192.168.1.100

我的需求是这样子的, 需要在0段广播, 这样可以被其他设备发现.

测试中发现设备A只能在两个网段的其中一个子网里广播, 并且不知道在哪配置

测试过程是这样的,
计算机B配置为0段, 与A直连
计算机C配置为1段, 与A直连
启用两个网卡的时候, 计算机C是收不到A的广播信息的, 当禁用了1段所在的网卡后, 计算机C就可以收到广播了, 之间广播程序不重启.

广播部分主要代码是这样的
SOCKADDR_IN SockAddr;

// Init address
memset (&SockAddr, 0, sizeof(SockAddr));
SockAddr.sin_family = AF_INET;
SockAddr.sin_port = htons(theTCS->CFG.TCSLocalServer.Port);
SockAddr.sin_addr.S_un.S_addr = INADDR_BROADCAST;

// Create UDP sock
SOCKET BroadcastSock = socket (AF_INET, SOCK_DGRAM, 0);

// Enable broadcast option.
BOOL fBroadcast = TRUE;
setsockopt (BroadcastSock, SOL_SOCKET, SO_BROADCAST, (char *)&fBroadcast, sizeof(fBroadcast));

byte* buf = new byte[bufSize]; 

//fill buf
...

// Broadcast identifier
while(!m_quit) 
{
    if (sendto (BroadcastSock, (char*)buf, bufSize, 0, (sockaddr*)&SockAddr, sizeof(SockAddr)) ==  SOCKET_ERROR)
    {
        break;
    }

    Sleep(5000);

}

closesocket (BroadcastSock);

delete[] buf;
  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答

1条回答

  • songhtao 我不懂电脑 5年前

    使用指定eth1的IP地址建立bind
    struct sockaddr_in sin;

    sin.sin_addr.s_addr = inet_addr("192.168.21.1"); // eth1 的地址
    sin.sin_port = port;

    bind(s, (strcut sockaddr*)&sin, sizeof(sin));

    点赞 评论 复制链接分享

相关推荐