kopia lustrzana https://github.com/Hamlib/Hamlib
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).
rodzic
88e86fb62a
commit
5b86d4efff
|
@ -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, }
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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;
|
||||
|
|
Ładowanie…
Reference in New Issue