UDP connect() и recv() в Linux

Согласно руководству connect(2)

Если сокет sockfd имеет тип SOCK_DGRAM, то serv_addr - это адрес, на который по умолчанию отправляются датаграммы, и единственный адрес, с которого принимаются датаграммы. Если сокет имеет тип SOCK_STREAM или SOCK_SEQPACKET, этот вызов пытается установить соединение с сокетом, который привязан к адресу, указанному serv_addr.

Я пытаюсь фильтровать пакеты от двух различных многоадресных групп, которые транслируются через один и тот же порт, и я думал, что connect() сделает эту работу, но я не могу заставить его работать. На самом деле, когда я добавляю ее в свою программу, я не получаю никаких пакетов. Больше информации в этой теме.

Вот как я устанавливаю параметры соединения:

memset(&mc_addr, 0, sizeof(mc_addr));
mc_addr.sin_family = AF_INET;
mc_addr.sin_addr.s_addr = inet_addr(multicast_addr);
mc_addr.sin_port = htons(multicast_port);
printf("Connecting...\n");
if( connect(sd, (struct sockaddr*)&mc_addr, sizeof(mc_addr)) < 0 ) {
  perror("connect");
  return -1;
}

printf("Receiving...\n");
while( (len = recv(sd, msg_buf, sizeof(msg_buf), 0)) > 0 )
  printf("Received %d bytes\n", len);

5
задан Community 23 May 2017 в 12:07
поделиться