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

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

Solutions Collecting From Web of "如何在Linux中用C进行UDP广播?"

在许多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. */ 

放松是正确的,除了你应该使用“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"); } 

通常使用伯克利套接字API,将一个或多个数据报发送到一个已知的广播级 IP地址。

我最近写了udp组播服务器进行测试。 要订阅多播,您可以订阅您的客户端到多播组225.0.0.37端口12346和端口12345(2个订阅源 – 一个订阅源发送“Hello,World!”另一个“再见,办公室!”)。

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

 #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); } }