Я работаю над проектом клиент / сервер, используя сокет udp в C / C ++ в Linux.На сервере необходимо записать многоадресную и одноадресную чтения.На клиенте необходимо прочитать многоадресную рассылку и написать одноадреснуюНе могу использовать сторонние библиотеки.только 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;
}
}