使用多播时的多播端口务必和主机Socket绑定的端口一致
使用多播时的多播端口必须和主机Socket绑定的端口一致?
在上面代码中,我将 socket绑定到这个地址 addr_local.sin_port = htons(MULTICAST_PORT + 1);
但是在向多播组发送数据的时候,我使用了如下的代码:
addr_multicast.sin_port = htons(MULTICAST_PORT);这是多播的端口
当Socket绑定的端口和多播组的端口一致的话,发送给本机就可以成功,不一致就失败;请问为什么?
我的理解:
一个socket绑定到本地某端口,和多播组的端口其实应该没什么关系的。
recvfrom我认为就是用该socket在本地的端口接收从多播组某端口发来的数据。
但是实际情况和我设想的不一致,何解?
------解决思路----------------------
对于楼主的问题,前段时间我也一直在纠结各种端口问题。终于有了点新的。对于多播,还是UDP协议。 sendto的参数包含了目的方的ip和端口。 也就是说接受方只有设置为 发送 给的端口,才能接受到。所以你说要不要设置为一样的?? 还有多播 只是逻辑上的一种 划分 。在ip层或数据链路层上 做了处理。这个不要管。 这样你就可以把 多播 当成 单纯的udp了。 是不是容易理解了?我也是新手,最近也在学习这些东西。一起努力吧。
DWORD CDlgMulticast::ThreadProc()
{
WSADATA wsaData;
WSAStartup(MAKEWORD(2,2), &wsaData);
m_hSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP);
// 本地地址结构
DWORD dwIPAddr = CSocketHelper::GetLocalIPAddr(0);
struct sockaddr_in addr_local;
memset(&addr_local, 0, sizeof(addr_local));
addr_local.sin_family = AF_INET;
addr_local.sin_addr.s_addr = dwIPAddr;
addr_local.sin_port = htons(MULTICAST_PORT + 1);
// 将套接字绑定到本地地址结构
bind(m_hSocket, (struct sockaddr *) &addr_local, sizeof(addr_local));
// 加入组播地址
ip_mreq mreq;
mreq.imr_multiaddr.s_addr = inet_addr(MULTICAST_IPADDRESS);
mreq.imr_interface.s_addr = dwIPAddr;
setsockopt(m_hSocket, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char*)&mreq, sizeof(mreq));
while (1) {
char msgbuf[512] = {0};
struct sockaddr_in addr_from;
int len = sizeof(addr_from);
int nbytes = recvfrom(m_hSocket, msgbuf, sizeof(msgbuf), 0, (struct sockaddr *) &addr_from, (socklen_t *)&len);
int nErr = WSAGetLastError();
Sleep(1);
}
WSACleanup();
return TRUE;
}
在上面代码中,我将 socket绑定到这个地址 addr_local.sin_port = htons(MULTICAST_PORT + 1);
但是在向多播组发送数据的时候,我使用了如下的代码:
void CDlgMulticast::OnBnClickedBtnSend()
{
// TODO: Add your control notification handler code here
TCHAR szText[256] = {0};
GetDlgItem(IDC_EDIT_TEXT)->GetWindowText(szText, 256);
Ark64::CW2A w2a(szText);
BYTE byteBuffer[512] = {0};
memcpy( byteBuffer, w2a.m_psz, sizeof(byteBuffer) );
// 构建组播地址
struct sockaddr_in addr_multicast;
memset(&addr_multicast, 0, sizeof(addr_multicast));
addr_multicast.sin_family = AF_INET;
addr_multicast.sin_addr.s_addr = inet_addr(MULTICAST_IPADDRESS);
addr_multicast.sin_port = htons(MULTICAST_PORT);
// 从组播地址发送消息
int nRet = sendto( m_hSocket, (char*)byteBuffer, sizeof(byteBuffer), 0, (sockaddr*)&addr_multicast, sizeof(addr_multicast) );
if( nRet == SOCKET_ERROR ) {
LogPrintf(_T("WSAErrorCode : %d/n"), WSAGetLastError());
} else {
LogPrintfA("It'm_hSocket OK.\n");
}
}
addr_multicast.sin_port = htons(MULTICAST_PORT);这是多播的端口
当Socket绑定的端口和多播组的端口一致的话,发送给本机就可以成功,不一致就失败;请问为什么?
我的理解:
一个socket绑定到本地某端口,和多播组的端口其实应该没什么关系的。
recvfrom我认为就是用该socket在本地的端口接收从多播组某端口发来的数据。
但是实际情况和我设想的不一致,何解?
------解决思路----------------------
对于楼主的问题,前段时间我也一直在纠结各种端口问题。终于有了点新的。对于多播,还是UDP协议。 sendto的参数包含了目的方的ip和端口。 也就是说接受方只有设置为 发送 给的端口,才能接受到。所以你说要不要设置为一样的?? 还有多播 只是逻辑上的一种 划分 。在ip层或数据链路层上 做了处理。这个不要管。 这样你就可以把 多播 当成 单纯的udp了。 是不是容易理解了?我也是新手,最近也在学习这些东西。一起努力吧。