我需要2个套接字进行多播发送和单播读取吗?

时间:2019-02-22 23:19:57

标签: c++ linux sockets udp multicast

我正在使用Linux上C / C ++中的udp套接字来处理客户机/服务器项目。在服务器上,它需要写入多播和读取单播。在客户端上,它需要读取多播和写入单播。无法使用第三方库。只有GLIBC

客户端和服务器都需要2个套接字吗?一个用于多播的套接字和一个用于单播的套接字?

顺便说一句,给出了IP地址和端口。

预先感谢您的帮助。

这是我的代码,

服务器

ln -sr a b

客户代码

// 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 );

1 个答案:

答案 0 :(得分:1)

是的,每个进程可以使用一个套接字。您应该将所有内容设置为好像只是在接收(不要调用connect()),然后使用sendto()将数据报发送到指定的地址。

参考:https://linux.die.net/man/3/sendto