Bind multicast receiver to INADDR_ANY on Windows, because binding to multicast group IPs doesn't seem to work. Use a different port number for (4351) multicast receiver commands to avoid multicast publisher packets ending up in the receiver (loopback issue).

pull/1413/head
Mikael Nousiainen 2023-11-02 18:00:16 +02:00
rodzic 88e86fb62a
commit 5b86d4efff
3 zmienionych plików z 17 dodań i 5 usunięć

Wyświetl plik

@ -208,7 +208,7 @@ static const struct confparams frontend_cfg_params[] =
{
TOK_MULTICAST_CMD_PORT, "multicast_cmd_port", "Multicast command server UDP port",
"Multicast data UDP port for sending commands to rig",
"4532", RIG_CONF_NUMERIC, { .n = { 0, 1000000, 1 } }
"4531", RIG_CONF_NUMERIC, { .n = { 0, 1000000, 1 } }
},
{ RIG_CONF_END, NULL, }

Wyświetl plik

@ -996,8 +996,6 @@ void *multicast_receiver(void *arg)
rig_debug(RIG_DEBUG_VERBOSE, "%s(%d): Starting multicast receiver\n", __FILE__,
__LINE__);
// Not working right now
#if 0
int optval = 1;
if (setsockopt(socket_fd, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval)) < 0)
{
@ -1005,11 +1003,25 @@ void *multicast_receiver(void *arg)
strerror(errno));
return NULL;
}
#if defined(SO_REUSEPORT)
// Windows does not have SO_REUSEPORT. However, SO_REUSEADDR works in a similar way.
if (setsockopt(socket_fd, SOL_SOCKET, SO_REUSEPORT, &optval, sizeof(optval)) < 0)
{
rig_debug(RIG_DEBUG_ERR, "%s: error enabling UDP port reuse: %s\n", __func__,
strerror(errno));
return NULL;
}
#endif
memset(&dest_addr, 0, sizeof(dest_addr));
dest_addr.sin_family = AF_INET;
#ifdef __MINGW32__
// Windows cannot bind to multicast group addresses for some unknown reason
dest_addr.sin_addr.s_addr = htonl(INADDR_ANY);
#else
dest_addr.sin_addr.s_addr = inet_addr(args->multicast_addr);
#endif
dest_addr.sin_port = htons(args->multicast_port);
if (bind(socket_fd, (struct sockaddr *) &dest_addr, sizeof(dest_addr)) < 0)
@ -1022,7 +1034,7 @@ void *multicast_receiver(void *arg)
struct ip_mreq mreq;
memset(&mreq, 0, sizeof(mreq));
mreq.imr_multiaddr.s_addr = inet_addr(args->multicast_addr);
mreq.imr_interface.s_addr = INADDR_ANY;
mreq.imr_interface.s_addr = htonl(INADDR_ANY);
if (setsockopt(socket_fd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq)) < 0)
{

Wyświetl plik

@ -674,7 +674,7 @@ RIG *HAMLIB_API rig_init(rig_model_t rig_model)
rs->multicast_data_addr = "224.0.0.1"; // enable multicast data publishing by default
rs->multicast_data_port = 4532;
rs->multicast_cmd_addr = "224.0.0.2"; // enable multicast command server by default
rs->multicast_cmd_port = 4532;
rs->multicast_cmd_port = 4531;
rs->lo_freq = 0;
rs->cache.timeout_ms = 500; // 500ms cache timeout by default
rs->cache.ptt = 0;