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

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/337422/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-03 16:46:15  来源:igfitidea点击:

How to UDP Broadcast with C in Linux?

linuxudp

提问by Daniel Silveira

How to UDP Broadcast with C in Linux?

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

回答by unwind

Typically using the Berkeley sockets API, to sendto()one or more datagrams to a known broadcast-classIP address.

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

回答by shodanex

Unwind has it right, except you should use 'sendto'

放松是正确的,除了你应该使用“发送”

Here is an example, that assumes you already have a socket. It was taken from clamav

这是一个示例,假设您已经有一个套接字。它取自clamav

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

    if(broadcastSock < 0)
        return;

    memset(&s, '
#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);
    }
}
', 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"); }

回答by shodanex

I wrote udp multicast server recently for testing. To subscribe to multicast you would subscribe your client to Multicast group 225.0.0.37 port 12346 and port 12345 (2 feeds - one feeds sends "Hello, World!" the other one "Bye, Office!").

我最近写了 udp 多播服务器进行测试。要订阅多播,您需要为客户端订阅多播组 225.0.0.37 端口 12346 和端口 12345(2 个提要 - 一个提要发送“Hello, World!”另一个提要“Bye, Office!”)。

I've been using it for testing my client, both client and server run on the same box so there might be bits that may not work but give it a try first.

我一直在用它来测试我的客户端,客户端和服务器都在同一个机器上运行,所以可能有些位可能不起作用,但先试一试。

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. */

回答by skoylu

In many IP stack, such as Linux, this code does not work. Your socket must have broadcast permissions. Try this:

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

##代码##