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",
|
TOK_MULTICAST_CMD_PORT, "multicast_cmd_port", "Multicast command server UDP port",
|
||||||
"Multicast data UDP port for sending commands to rig",
|
"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, }
|
{ 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__,
|
rig_debug(RIG_DEBUG_VERBOSE, "%s(%d): Starting multicast receiver\n", __FILE__,
|
||||||
__LINE__);
|
__LINE__);
|
||||||
|
|
||||||
// Not working right now
|
|
||||||
#if 0
|
|
||||||
int optval = 1;
|
int optval = 1;
|
||||||
if (setsockopt(socket_fd, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval)) < 0)
|
if (setsockopt(socket_fd, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval)) < 0)
|
||||||
{
|
{
|
||||||
|
@ -1005,11 +1003,25 @@ void *multicast_receiver(void *arg)
|
||||||
strerror(errno));
|
strerror(errno));
|
||||||
return NULL;
|
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
|
#endif
|
||||||
|
|
||||||
memset(&dest_addr, 0, sizeof(dest_addr));
|
memset(&dest_addr, 0, sizeof(dest_addr));
|
||||||
dest_addr.sin_family = AF_INET;
|
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);
|
dest_addr.sin_addr.s_addr = inet_addr(args->multicast_addr);
|
||||||
|
#endif
|
||||||
dest_addr.sin_port = htons(args->multicast_port);
|
dest_addr.sin_port = htons(args->multicast_port);
|
||||||
|
|
||||||
if (bind(socket_fd, (struct sockaddr *) &dest_addr, sizeof(dest_addr)) < 0)
|
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;
|
struct ip_mreq mreq;
|
||||||
memset(&mreq, 0, sizeof(mreq));
|
memset(&mreq, 0, sizeof(mreq));
|
||||||
mreq.imr_multiaddr.s_addr = inet_addr(args->multicast_addr);
|
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)
|
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_addr = "224.0.0.1"; // enable multicast data publishing by default
|
||||||
rs->multicast_data_port = 4532;
|
rs->multicast_data_port = 4532;
|
||||||
rs->multicast_cmd_addr = "224.0.0.2"; // enable multicast command server by default
|
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->lo_freq = 0;
|
||||||
rs->cache.timeout_ms = 500; // 500ms cache timeout by default
|
rs->cache.timeout_ms = 500; // 500ms cache timeout by default
|
||||||
rs->cache.ptt = 0;
|
rs->cache.ptt = 0;
|
||||||
|
|
Ładowanie…
Reference in New Issue