我是否需要2个插座来进行多播和单播
do i need 2 sockets for multicast send and unicast read?
我正在使用Linux上的C/C 中的UDP套接字在客户端/服务器项目上工作。在服务器上,它需要编写多播并读取单播。在客户上,它需要读取多播并编写单播。无法使用第三方库。只有glibc
我是否需要2个客户和服务器?一个用于多播的插座和一个单播的插座?
顺便说一句,给出了IP地址和端口。
事先感谢您的所有帮助。
这是我的代码
服务器
// open a UDP socket
m_sock = socket( AF_INET, SOCK_DGRAM, IPPROTO_IP );
if ( m_sock < 0 )
{
std::cerr << "ERROR: create socket failed ..." << std::endl;
return( false );
}
m_saddr.sin_family = AF_INET;
m_saddr.sin_port = htons(0); // Use the first free port
m_saddr.sin_addr.s_addr = htonl(INADDR_ANY); // bind socket to any interface
// Disable loopback
char loopch{ 0 };
int rc = setsockopt( m_sock, IPPROTO_IP, IP_MULTICAST_LOOP, (char *)&loopch, sizeof( loopch ) );
if ( rc < 0 )
{
std::cerr << "ERROR: setsockopt( ) to disable loopback failed, rc = "
<< rc << std::endl;
return( false );
}
// Set local interface for outbound multicast datagrams.
// The IP address specified must be associated with a local
// multicast capable interface.
m_localInterface.s_addr = htonl( INADDR_ANY );
rc = setsockopt( m_sock, IPPROTO_IP, IP_MULTICAST_IF, (char*)&m_localInterface,sizeof(m_localInterface) );
if ( rc < 0)
{
std::cerr << "ERROR: Setting local interface failed, rc: " << rc << std::endl;
return( false );
}
rc = bind( m_sock, (struct sockaddr *)&m_saddr, sizeof( struct sockaddr_in ) );
if ( rc < 0 )
{
std::cerr << "ERROR: binding socket to interface failed ..." << std::endl;
exit( -1 );
}
m_saddr.sin_family = AF_INET;
m_saddr.sin_port = htons( UDP_PORT );
m_saddr.sin_addr.s_addr = inet_addr( UDP_ADDRESS );
客户端代码
// open a UDP socket
m_sock = socket( AF_INET, SOCK_DGRAM, IPPROTO_IP );
if ( m_sock < 0 )
{
std::cerr << "ERROR: create socket failed ..." << std::endl;
return( false );
}
m_saddr.sin_family = AF_INET;
m_saddr.sin_port = htons( UDP_PORT ); // listen on port defined UDP_PORT
m_saddr.sin_addr.s_addr = htonl(INADDR_ANY); // bind socket to any interface
// Disable loopback
char loopch{ 0 };
int rc = setsockopt( m_sock, IPPROTO_IP, IP_MULTICAST_LOOP, (char *)&loopch, sizeof( loopch ) );
if ( rc < 0 )
{
std::cerr << "ERROR: setsockopt( ) to disable loopback failed, rc = "
<< rc << std::endl;
return( false );
}
rc = bind( m_sock, (struct sockaddr *)&m_saddr, sizeof( struct sockaddr_in ) );
if ( rc < 0 )
{
std::cerr << "ERROR: binding socket to interface failed ..." << std::endl;
exit( -1 );
}
// JOIN multicast group on default interface
m_imreq.imr_multiaddr.s_addr = inet_addr( UDP_ADDRESS );
m_imreq.imr_interface.s_addr = htonl( INADDR_ANY ); // use DEFAULT interface
rc = setsockopt( m_sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, (const void *)&m_imreq, sizeof( struct ip_mreq ) );
if ( rc < 0)
{
std::cerr << "ERROR: Setting local interface error" << std::endl;
return false;
}
socklen_t m_socklen = sizeof(struct sockaddr_in);
while ( 1 )
{
rc = recvfrom( m_sock, buffer, MAX_BUFFER_SIZE, 0,
(struct sockaddr *)&m_saddr, &m_socklen );
if ( rc < 0 )
{
std::cerr << "ERROR: receive multicast message failed ..." << std::endl;
break;
}
else
{
std::cout << "Received multicast ..." << std::endl;
}
}
是的,您可以使用一个套接字每个进程进行操作。您应该将所有内容设置为仅接收(不要调用connect()
),然后使用sendto()
将数据报发送到指定的地址。
参考:https://linux.die.net/man/3/sendto
相关文章:
- 如何使用虚幻引擎"filter"多播?
- 无法在 Windows 10 上加入 IPV6 多播组
- 如何在 Linux 上的 C/C++ 中使用 ipv6 udp 套接字进行多播?
- IPv6 多播在局域网中不起作用
- 简单的多播应用程序无法在同一网络上的不同计算机上运行
- 我是否需要2个插座来进行多播和单播
- 在Qt上使用QUdpSocket的单播
- 在 ipv6 链接范围单播 udp 客户端-服务器中应用 boost::asio::ip::udp,有时有效,但有时无效
- 分析多表单 MIME 类型的内容处置字段
- 单个多对象卡尔曼滤波器与多个单对象卡尔曼滤波器(多个)
- 多个接口上的多个组播
- IP_ADD_MEMBERSHIP套接字上,套接字是否也会侦听单播
- 如何从更基本的同步原语中创建多读/单写锁
- ZeroMQ无法在单播IPv6上运行
- libcurl多接口单易接口多请求
- 在std::multiset中,如果找到一个元素,有一个函数或算法可以只擦除一个样本(单播或重复)
- Linux上跨共享库的多个单例实例
- 如何使多播套接字不接收单播数据?
- OpenCV多摄像机单图像
- 使用boost::asio执行单播消息传递