如何在Linux中使用C进行UDP广播?

Dan*_*ira 30 linux udp

如何在Linux中使用C进行UDP广播?

小智 42

在许多IP堆栈中,例如Linux,此代码不起作用.您的套接字必须具有广播权限.试试这个:

bcast_sock = socket(AF_INET, SOCK_DGRAM, 0);
int broadcastEnable=1;
int ret=setsockopt(bcast_sock, SOL_SOCKET, SO_BROADCAST, &broadcastEnable, sizeof(broadcastEnable));

/* Add other code, sockaddr, sendto() etc. */
Run Code Online (Sandbox Code Playgroud)

  • 是正确的!如果您不授予套接字广播权限,您将获得权限被拒绝错误消息. (7认同)
  • POSIX实际上需要此行为,如果没有为套接字设置SO_BROADCAST选项,请参阅http://pubs.opengroup.org/onlinepubs/009695399/functions/sendto.html`sendto()将失败 (7认同)
  • 您能澄清一下“此代码不起作用”的意思吗?该问题不包含任何代码。 (4认同)
  • 是的,这个答案中的代码示例确实很好地回答了这个问题,并且使用了最新的代码。但我仍然不知道“这段代码不起作用”指的是哪段代码。如果引用其他答案中的代码,那么应该是“其他答案中的代码不起作用”。如果引用了特定答案,您可以使用“[用户]答案中的代码不起作用”甚至“本身不起作用”。这里的措辞只是让这个答案有点难以理解。 (3认同)

sho*_*nex 13

放松是正确的,除了你应该使用'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");
}
Run Code Online (Sandbox Code Playgroud)


unw*_*ind 4

通常使用 Berkeley 套接字 API 将sendto()一个或多个数据报发送到已知的广播级IP 地址。