如何在Linux中用C進行UDP廣播?如何在Linux中使用C進行UDP廣播?
回答
通常使用Berkeley sockets API,將sendto()
一個或多個數據報發送到已知的broadcast-class IP地址。
我改變了建議的功能,以匹配shodane挖出的實際代碼。 – unwind 2008-12-03 15:33:46
開卷有它的權利,但你應該使用「的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");
}
我最近寫了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);
}
}
這與問題有什麼關係?問題是關於廣播,這是關於多播 – xaxxon 2013-09-02 07:10:21
在許多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. */
- 1. 在C++中使用UDP進行多點廣播
- 2. 使用PHP進行UDP廣播
- 3. 如何從Linux內核進行UDP廣播?
- 4. 如何在Linux上使用C/C++與ipv6 udp套接字進行組播?
- 5. 如何在UDP中進行部分廣播?
- 6. iOS UDP廣播與PHP UDP廣播
- 7. 如何使用C中的GStreamer連接到UDP視頻廣播
- 8. C++發送UDP廣播
- 9. 在Java中的UDP廣播
- 10. 使用IOS上的CFSocket進行UDP廣播
- 11. 如何區分UDP廣播和單播?
- 12. 使用UDP在Wifi Direct上廣播
- 13. C++中的UDP廣播實現
- 14. 接收UDP廣播消息在C#
- 15. Java nio udp廣播
- 16. Firemonkey印UDP廣播
- 17. UDP多廣播nodejs
- 18. UDP廣播壓力
- 19. UDP廣播問題?
- 20. 迴應UDP廣播
- 21. boost :: asio UDP廣播
- 22. 接收UDP廣播
- 23. Android 3G UDP廣播
- 24. UDP廣播問題
- 25. 收聽UDP廣播
- 26. UDP廣播或IP多播?
- 27. 如何在本地使用UDP套接字廣播消息?
- 28. 使用Python廣播UDP字符串
- 29. 使用增強庫收聽udp廣播
- 30. 接收UDP廣播(C#)的答案
以編程方式,或通過工具/工具? – ayaz 2008-12-03 15:14:50