Как к широковещательной передаче UDP с C в Linux?

В вашей петле используется только имя символа, поэтому R думает, что это просто вектор символа. Вам нужно получить объект сам. Вы можете использовать mget() для получения нескольких объектов в заданной среде, в списке, из символьного вектора. Это означает, что мы можем передать его ls(). Затем мы можем запустить этот список и получить класс.

lapply(mget(ls()), class)

Я использую lapply(), потому что вполне возможно, что некоторые объекты имеют более одного класса.

Если вы хотите узнать другие атрибуты / информацию об объекте, написать функцию.

f <- function(x) list(dim = dim(x), class = class(x))
lapply(mget(ls()), f)
29
задан Daniel Silveira 3 December 2008 в 15:03
поделиться

3 ответа

У размотки все в порядке, за исключением того, что вы должны использовать sendto

Вот пример, который предполагает, что у вас уже есть сокет. Это было взято из Clamav

static void
broadcast(const char *mess)
{
    struct sockaddr_in s;

    if(broadcastSock < 0)
        return;

    memset(&s, '\0', sizeof(struct sockaddr_in));
    s.sin_family = AF_INET;
    s.sin_port = (in_port_t)htons(tcpSocket ? tcpSocket : 3310);
    s.sin_addr.s_addr = htonl(INADDR_BROADCAST);

    cli_dbgmsg("broadcast %s to %d\n", mess, broadcastSock);
    if(sendto(broadcastSock, mess, strlen(mess), 0, (struct sockaddr *)&s, sizeof(struct sockaddr_in)) < 0)
        perror("sendto");
}
13
ответ дан Matthew Murdoch 14 October 2019 в 07:52
поделиться

Обычно использование Беркли снабжает API сокетом, к sendto() одна или несколько дейтаграмм к известному IP-адрес широковещательного класса .

4
ответ дан unwind 14 October 2019 в 07:52
поделиться

Я недавно записал udp сервер многоадресной передачи для тестирования. Подписываться для многоадресной передачи Вас подписало бы Ваш клиент на Группу многоадресной передачи 225.0.0.37 порта 12346 и порт 12345 (2 подачи - каждый питается, отправляет "Привет, Мир!" другой один "До свидания, Office!").

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

#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <time.h>
#include <string.h>
#include <stdio.h>

#include <unistd.h>


#define BYE_OFFICE 12346
#define HELLO_PORT 12345
#define HELLO_GROUP "225.0.0.37"

int main(int argc, char *argv[])
{
    struct sockaddr_in addr;
    struct sockaddr_in addr2;
    int fd;
    int fd2;
    char *message = "Hello, World!";
    char *message2 = "Bye, Office!";

    if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
    {
        perror("socket");
        exit(1);
    }

    if ((fd2 = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
    {
        perror("socket");
        exit(1);
    }

    /* set up destination address */
    memset(&addr,0,sizeof(addr));
    addr.sin_family = AF_INET;
    addr.sin_addr.s_addr = inet_addr(HELLO_GROUP);
    addr.sin_port=htons(HELLO_PORT);

    memset(&addr2,0,sizeof(addr2));
    addr2.sin_family = AF_INET;
    addr2.sin_addr.s_addr = inet_addr(HELLO_GROUP);
    addr2.sin_port=htons(BYE_OFFICE);

    while (1)
    {
        if (sendto(fd, message, strlen(message), 0,(struct sockaddr *) &addr, sizeof(addr)) < 0)
        {
            perror("sendto");
            exit(1);
        }
        sleep(3);
        if (sendto(fd2, message2, strlen(message2), 0,(struct sockaddr *) &addr2, sizeof(addr2)) < 0)
        {
            perror("sendto2");
            exit(1);
        }
        sleep(3);
    }
}
2
ответ дан 14 October 2019 в 07:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: