dowhile1 2016-07-20 08:52 采纳率: 100%
浏览 1341
已采纳

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

计算机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;
  • 写回答

2条回答 默认 最新

  • 我不懂电脑 2016-07-20 11:01
    关注

    使用指定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));

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥20 sub地址DHCP问题
  • ¥15 delta降尺度计算的一些细节,有偿
  • ¥15 Arduino红外遥控代码有问题
  • ¥15 数值计算离散正交多项式
  • ¥30 数值计算均差系数编程
  • ¥15 redis-full-check比较 两个集群的数据出错
  • ¥15 Matlab编程问题
  • ¥15 训练的多模态特征融合模型准确度很低怎么办
  • ¥15 kylin启动报错log4j类冲突
  • ¥15 超声波模块测距控制点灯,灯的闪烁很不稳定,经过调试发现测的距离偏大