Здравствуйте, Mr.Delphist, Вы писали:
MD>Я бы рекомендовал для начала нарисовать минимальный пример на обычных беркли-сокетах, безо всякого asio.
А Вы не посоветуете какой-нибудь подобный пример? Наверняка должны быть готовые решения. Я погуглил, но то, что нашел, тоже не заработало (вечное ожидание данных), например:
#define PORT 30001
#define BSIZE 256
int main()
{
struct sockaddr_in sin;
char *buffer[ BSIZE ];
int sock;
int bytes_read;
socklen_t sin_len;
struct ip_mreq mreq;
/* Setup address */
memset( &sin, 0, sizeof( sin ) );
sin.sin_family = AF_INET;
sin.sin_port = htons( PORT );
sin.sin_addr.s_addr = htonl(INADDR_ANY);
sin_len = sizeof( sin );
/* Create socket */
sock = socket( AF_INET, SOCK_DGRAM, 0 );
if ( sock > 0 )
{
if (bind(sock, (struct sockaddr *) &sin, sizeof(sin)) < 0) {
perror("bind");
exit(1);
}
string group = "239.255.0.1";
string locAddr = "192.168.2.2";
mreq.imr_multiaddr.s_addr = inet_addr(group.c_str());
mreq.imr_interface.s_addr = inet_addr(locAddr.c_str());
if (setsockopt(sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq))< 0) {
perror("setsockopt");
exit(1);
}
/* Display any data found */
while( 1 )
{
bytes_read = recvfrom( sock, buffer, sizeof( buffer ), 0, ( struct sockaddr * ) &sin, &sin_len );
if ( bytes_read > 0 )
{
printf( "%s\n", buffer );
}
}
}
return 0;
}
Проверять могу только на машине с несколькими интерфейсами, на которые поступают разные данные. При этом сам UDP поток изменять не могу, он поступает на один из этих интерфейсов.