组播能否在一台机器上,没有网络连接的情况下先模拟完成?
我的关键代码如下,可是组播成员收不到发送的数据,请各位高手指点一下:
void CMulticastDlg::JoinGroup()
{
int iRet = 0; // return code // Create communication socket
m_hSocket = WSASocket(AF_INET, SOCK_DGRAM, 0, NULL, 0,
WSA_FLAG_OVERLAPPED | WSA_FLAG_MULTIPOINT_C_LEAF | WSA_FLAG_MULTIPOINT_D_LEAF);
if (m_hSocket == INVALID_SOCKET)
{
AfxMessageBox("Create communication socket fail!");
return;
} // Set socket option to reuse the port
BOOL bFlag = TRUE;
iRet = setsockopt(m_hSocket, SOL_SOCKET, SO_REUSEADDR, (char*)&bFlag, sizeof(bFlag));
if (iRet == SOCKET_ERROR)
{
AfxMessageBox("Set socket to reuse the port fail!");
return;
} // Bind the socket to a certain address
SOCKADDR_IN addrLocal;
addrLocal.sin_family = AF_INET;
addrLocal.sin_port = htons(m_uPort);
addrLocal.sin_addr.s_addr = INADDR_ANY;
iRet = bind(m_hSocket, (SOCKADDR*)&addrLocal, sizeof(SOCKADDR)); if (iRet == SOCKET_ERROR)
{
AfxMessageBox("Bind socket error!");
closesocket(m_hSocket);
return;
} // Set multicasting TTL option
int TTL = 8;
iRet = setsockopt(m_hSocket, IPPROTO_IP, IP_MULTICAST_TTL,
(const char*)&TTL, sizeof(int)); if (iRet == SOCKET_ERROR)
{
AfxMessageBox("Set multicasting option error!");
closesocket(m_hSocket);
return;
} // Join multicast group
m_addrRemote.sin_family = AF_INET;
m_addrRemote.sin_port = htons(m_uPort);
m_addrRemote.sin_addr.s_addr = inet_addr(m_strAddress); // WSABUF wsaCalleeData;
m_hGroupSocket = WSAJoinLeaf(m_hSocket, (SOCKADDR*)&m_addrRemote, sizeof(m_addrRemote),
NULL, NULL, NULL, NULL, JL_BOTH); if (m_hGroupSocket == INVALID_SOCKET)
{
AfxMessageBox("Join multicast leaf error!");
closesocket(m_hSocket);
return;
} // Set callback routine
iRet = WSAAsyncSelect(m_hGroupSocket, m_hWnd, WM_NETWORKEVENT, FD_WRITE | FD_READ); if (iRet == SOCKET_ERROR)
{
AfxMessageBox("Select error!");
closesocket(m_hSocket);
return;
} m_bConnect = TRUE;
}
我的关键代码如下,可是组播成员收不到发送的数据,请各位高手指点一下:
void CMulticastDlg::JoinGroup()
{
int iRet = 0; // return code // Create communication socket
m_hSocket = WSASocket(AF_INET, SOCK_DGRAM, 0, NULL, 0,
WSA_FLAG_OVERLAPPED | WSA_FLAG_MULTIPOINT_C_LEAF | WSA_FLAG_MULTIPOINT_D_LEAF);
if (m_hSocket == INVALID_SOCKET)
{
AfxMessageBox("Create communication socket fail!");
return;
} // Set socket option to reuse the port
BOOL bFlag = TRUE;
iRet = setsockopt(m_hSocket, SOL_SOCKET, SO_REUSEADDR, (char*)&bFlag, sizeof(bFlag));
if (iRet == SOCKET_ERROR)
{
AfxMessageBox("Set socket to reuse the port fail!");
return;
} // Bind the socket to a certain address
SOCKADDR_IN addrLocal;
addrLocal.sin_family = AF_INET;
addrLocal.sin_port = htons(m_uPort);
addrLocal.sin_addr.s_addr = INADDR_ANY;
iRet = bind(m_hSocket, (SOCKADDR*)&addrLocal, sizeof(SOCKADDR)); if (iRet == SOCKET_ERROR)
{
AfxMessageBox("Bind socket error!");
closesocket(m_hSocket);
return;
} // Set multicasting TTL option
int TTL = 8;
iRet = setsockopt(m_hSocket, IPPROTO_IP, IP_MULTICAST_TTL,
(const char*)&TTL, sizeof(int)); if (iRet == SOCKET_ERROR)
{
AfxMessageBox("Set multicasting option error!");
closesocket(m_hSocket);
return;
} // Join multicast group
m_addrRemote.sin_family = AF_INET;
m_addrRemote.sin_port = htons(m_uPort);
m_addrRemote.sin_addr.s_addr = inet_addr(m_strAddress); // WSABUF wsaCalleeData;
m_hGroupSocket = WSAJoinLeaf(m_hSocket, (SOCKADDR*)&m_addrRemote, sizeof(m_addrRemote),
NULL, NULL, NULL, NULL, JL_BOTH); if (m_hGroupSocket == INVALID_SOCKET)
{
AfxMessageBox("Join multicast leaf error!");
closesocket(m_hSocket);
return;
} // Set callback routine
iRet = WSAAsyncSelect(m_hGroupSocket, m_hWnd, WM_NETWORKEVENT, FD_WRITE | FD_READ); if (iRet == SOCKET_ERROR)
{
AfxMessageBox("Select error!");
closesocket(m_hSocket);
return;
} m_bConnect = TRUE;
}
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货