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