gpt4 book ai didi

c - 联网计算机未接收到多播

转载 作者:太空宇宙 更新时间:2023-11-04 07:38:22 25 4
gpt4 key购买 nike

我正在尝试向所有网络计算机发送多播。我在我的计算机上设置了服务器,在网络上设置了另一台计算机。当我发送多播消息时,在我的计算机上运行的服务器可以很好地接收它。联网的计算机没有得到任何东西。我已经尝试将 TTL 设置为其最大值,但没有做任何事情。我也尝试过使用 WireShark 监视我的数据包,但没有看到任何东西(我对此不是很熟练)。我很困惑为什么我的计算机会收到它,但另一台联网的计算机却不会。这是我用来发送多播的代码:

#include <sys/types.h>   /* for type definitions */
#include <winsock2.h> /* for win socket API calls */
#include <ws2tcpip.h> /* for win socket structs */
#include <stdio.h> /* for printf() */
#include <stdlib.h> /* for atoi() */
#include <string.h> /* for strlen() */

#define MAX_LEN 1024 /* maximum string size to send */
#define MIN_PORT 1024 /* minimum port allowed */
#define MAX_PORT 65535 /* maximum port allowed */

int main(int argc, char *argv[]) {

int sock; /* socket descriptor */
char send_str[MAX_LEN]; /* string to send */
struct sockaddr_in mc_addr; /* socket address structure */
int send_len; /* length of string to send */
char* mc_addr_str; /* multicast IP address */
unsigned short mc_port; /* multicast port */
unsigned char mc_ttl=255; /* time to live (hop count) */
WSADATA wsaData; /* Windows socket DLL structure */

/* validate number of arguments */
if (argc != 3) {
fprintf(stderr,
"Usage: %s <Multicast IP> <Multicast Port>\n",
argv[0]);
exit(1);
}

mc_addr_str = argv[1]; /* arg 1: multicast IP address */
mc_port = atoi(argv[2]); /* arg 2: multicast port number */

/* validate the port range */
if ((mc_port < MIN_PORT) || (mc_port > MAX_PORT)) {
fprintf(stderr, "Invalid port number argument %d.\n",
mc_port);
fprintf(stderr, "Valid range is between %d and %d.\n",
MIN_PORT, MAX_PORT);
exit(1);
}

/* Load Winsock 2.0 DLL */
if (WSAStartup(MAKEWORD(2, 0), &wsaData) != 0) {
fprintf(stderr, "WSAStartup() failed");
exit(1);
}

/* create a socket for sending to the multicast address */
if ((sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) {
perror("socket() failed");
exit(1);
}

/* set the TTL (time to live/hop count) for the send */
if ((setsockopt(sock, IPPROTO_IP, IP_MULTICAST_TTL,
(void*) &mc_ttl, sizeof(mc_ttl))) < 0) {
perror("setsockopt() failed");
exit(1);
}

/* construct a multicast address structure */
memset(&mc_addr, 0, sizeof(mc_addr));
mc_addr.sin_family = AF_INET;
mc_addr.sin_addr.s_addr = inet_addr(mc_addr_str);
mc_addr.sin_port = htons(mc_port);

printf("Begin typing (return to send, ctrl-C to quit):\n");

/* clear send buffer */
memset(send_str, 0, sizeof(send_str));

while (fgets(send_str, MAX_LEN, stdin)) {
send_len = strlen(send_str);

/* send string to multicast address */
if ((sendto(sock, send_str, send_len, 0,
(struct sockaddr *) &mc_addr,
sizeof(mc_addr))) != send_len) {
perror("sendto() sent incorrect number of bytes");
exit(1);
}

/* clear send buffer */
memset(send_str, 0, sizeof(send_str));
}

closesocket(sock);
WSACleanup(); /* Cleanup Winsock */

exit(0);
}

最佳答案

请看http://www.iana.org/assignments/multicast-addresses/multicast-addresses.xml

节选

The range of addresses between 224.0.0.0 and 224.0.0.255, inclusive, is reserved for the use of routing protocols and other low-level topology discovery or maintenance protocols, such as gateway discovery and group membership reporting. Multicast routers should not forward any multicast datagram with destination addresses in this range, regardless of its TTL.

具体来说,224.0.0.1 是为“该子网上的所有系统”保留的。

我不知道有什么命令可以确认您的交换机支持多播。我的经验法则是:消费级开关不会。企业级交换机可以。两者之间的一切;谷歌是你的 friend 。

上周我发现在企业级交换机中它也是可配置的困难方法(虽然我不是系统管理员而且我不知道如何做到这一点......)

关于c - 联网计算机未接收到多播,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6932025/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com