LinuxでCを使用してUDPブロードキャストを行う方法は?
98704 次
4 に答える
48
Linux などの多くの IP スタックでは、このコードは機能しません。ソケットにはブロードキャスト権限が必要です。これを試して:
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. */
于 2012-07-19T18:52:42.267 に答える
15
「sendto」を使用する必要があることを除いて、巻き戻しは正しいです
これは、すでにソケットがあることを前提とした例です。クラマフから持ってきた
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");
}
于 2008-12-03T15:17:13.507 に答える
4
通常、Berkeley ソケット API を使用して、sendto()
1 つまたは複数のデータグラムを既知のブロードキャスト クラスのIP アドレスに送信します。
于 2008-12-03T15:07:44.057 に答える
3
最近、テスト用に udp マルチキャスト サーバーを作成しました。マルチキャストにサブスクライブするには、クライアントをマルチキャスト グループ 225.0.0.37 ポート 12346 およびポート 12345 にサブスクライブします (2 つのフィード - 1 つのフィードは「Hello, World!」を送信し、もう 1 つのフィードは「Bye, 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);
}
}
于 2008-12-12T04:15:23.557 に答える