Отправка широковещательной передачи в Linux через сокеты


Решено пожалуйста, закройте вопрос (но я действительно не знаю, как : / плохой день)

Я пытаюсь отправить широковещание в linux через сокеты, оно всегда выходило через оба интерфейса (у меня есть активные eth0 и eth1, оба в разных сегментах), но suddelny, он выходит только через первый, eth0

Вот код:

void sendBroad(char *dstIP, char *localIP)
{
    int sock;                         /* Socket */
    struct sockaddr_in broadcastAddr; /* Broadcast address */
    int broadcastPermission;          /* Socket opt to set permission to broadcast */
    unsigned int localIPLen;       /* Length of string to broadcast */


    /* Create socket for sending/receiving datagrams */
    if ((sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0)
        perror("socket() failed");

    /* Set socket to allow broadcast */
    broadcastPermission = 1;
    if (setsockopt(sock, SOL_SOCKET, SO_BROADCAST, (void *) &broadcastPermission, 
          sizeof(broadcastPermission)) < 0)
        perror("setsockopt() failed");

    /* Construct local address structure */
    memset(&broadcastAddr, 0, sizeof(broadcastAddr));   /* Zero out structure */
    broadcastAddr.sin_family = AF_INET;                 /* Internet address family */
    broadcastAddr.sin_addr.s_addr = inet_addr(dstIP);   /* Broadcast IP address */
    broadcastAddr.sin_port = htons(BroadcastPort);      /* Broadcast port */

    localIPLen = strlen(localIP);  /* Find length of localIP */
    int j;
    for (j=0; j<1; j++) //doesnt mean anything so far, not important
    {
         /* Broadcast localIP in datagram to clients */
         if (sendto(sock, localIP, localIPLen, 0, (struct sockaddr *) 
               &broadcastAddr, sizeof(broadcastAddr)) != localIPLen)
             perror("sendto() sent a different number of bytes than expected");


    }
}

Какая-нибудь помощь в этом вопросе?

Заранее спасибо!

2   3   2011-07-21 18:45:23

2 ответа:

Ваш код выглядит нормально с первого взгляда. Проблема, возможно, была в IP-адресе назначения.

NB вы понимаете, что дейтаграмма все равно приходит вместе со своим исходным адресом? Вам также не нужно вводить адрес в полезную нагрузку. Вы можете поместить туда что-то более конкретное, например идентификатор приложения.

Просто нужно было исправить широковещательные порты, это было смешано. Сам код в порядке