solved the problem that Windows cannot multicast (#576)

* Solve the problem that Windows cannot multicast.

* Better git judgment logic.
This commit is contained in:
fengdaolong 2021-01-12 16:41:40 +08:00 committed by GitHub
parent c99f610f73
commit 3a480a4a21
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 86 additions and 8 deletions

View File

@ -7,13 +7,14 @@ set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
# N2n release information
set(N2N_VERSION "2.9.0")
set(N2N_OSNAME ${CMAKE_SYSTEM})
set(N2N_OSNAME ${CMAKE_SYSTEM_NAME})
execute_process(
COMMAND git --version
COMMAND git status
WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
OUTPUT_VARIABLE GIT_EXIST
OUTPUT_VARIABLE GIT_OUTPUT
RESULT_VARIABLE GIT_ERROR_CODE
)
if (GIT_EXIST)
if (GIT_ERROR_CODE EQUAL 0)
execute_process(
COMMAND git rev-list --count HEAD
WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
@ -28,7 +29,7 @@ string(REGEX REPLACE "\n$" "" GIT_REV "${GIT_REV}")
string(REGEX REPLACE "\n$" "" GIT_ID "${GIT_ID}")
set(N2N_VERSION "${N2N_VERSION}.r${GIT_REV}.${GIT_ID}")
MESSAGE(STATUS "Build from git rev: ${N2N_VERSION}")
endif (GIT_EXIST)
endif (GIT_ERROR_CODE EQUAL 0)
add_definitions(-DCMAKE_BUILD)
add_definitions(-DGIT_RELEASE="${N2N_VERSION}" -DPACKAGE_VERSION="${N2N_VERSION}" -DPACKAGE_OSNAME="${N2N_OSNAME}")
@ -142,7 +143,7 @@ endif(N2N_OPTION_USE_ZSTD)
if(DEFINED WIN32)
add_library(edge_utils_win32 src/edge_utils_win32.c)
add_subdirectory(win32)
target_link_libraries(n2n edge_utils_win32 n2n_win32 )
target_link_libraries(n2n edge_utils_win32 n2n_win32 iphlpapi)
endif(DEFINED WIN32)
add_executable(edge src/edge.c)
@ -164,7 +165,7 @@ if(N2N_OPTION_USE_PCAPLIB AND (NOT DEFINED WIN32))
# Linux Capabilities
find_library(CAP_LIB cap)
if(CAP_LIB)
target_link_libraries(edge cap)
target_link_libraries(edge cap.a)
set(CMAKE_REQUIRED_LIBRARIES ${CAP_LIB})
ADD_DEFINITIONS("-DHAVE_LIBCAP")
endif()

View File

@ -25,10 +25,17 @@
#include <process.h>
#include <n2n.h>
#include <winsock2.h>
#include <iphlpapi.h>
/* Multicast peers discovery disabled due to https://github.com/ntop/n2n/issues/65 */
#define SKIP_MULTICAST_PEERS_DISCOVERY
/* Currently, multicast is performed by specifying the default routing network adapter.
* If the solution is determined to be stable and effective,
* all macro definitions "SKIP_MULTICAST_PEERS_DISCOVERY" will be completely deleted in the future.
*/
//#define SKIP_MULTICAST_PEERS_DISCOVERY
struct tunread_arg {
n2n_edge_t *eee;
@ -36,6 +43,7 @@ struct tunread_arg {
};
extern HANDLE startTunReadThread (struct tunread_arg *arg);
int get_best_interface_ip(n2n_edge_t * eee, dec_ip_str_t ip_addr);
#endif /* WIN32 */

View File

@ -718,6 +718,9 @@ static ssize_t sendto_sock (int fd, const void * buf,
if(sent < 0) {
char * c = strerror(errno);
traceEvent(TRACE_ERROR, "sendto failed (%d) %s", errno, c);
#ifdef WIN32
traceEvent(TRACE_ERROR, "WSAGetLastError(): %u", WSAGetLastError());
#endif
} else {
traceEvent(TRACE_DEBUG, "sendto sent=%d to ", (signed int)sent);
}
@ -734,7 +737,13 @@ static void check_join_multicast_group (n2n_edge_t *eee) {
if(!eee->multicast_joined) {
struct ip_mreq mreq;
mreq.imr_multiaddr.s_addr = inet_addr(N2N_MULTICAST_GROUP);
#ifdef WIN32
dec_ip_str_t ip_addr;
get_best_interface_ip(eee, ip_addr);
mreq.imr_interface.s_addr = inet_addr(ip_addr);
#else
mreq.imr_interface.s_addr = htonl(INADDR_ANY);
#endif
if(setsockopt(eee->udp_multicast_sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char *)&mreq, sizeof(mreq)) < 0) {
traceEvent(TRACE_WARNING, "Failed to bind to local multicast group %s:%u [errno %u]",

View File

@ -48,5 +48,65 @@ HANDLE startTunReadThread (struct tunread_arg *arg) {
0, /* thread creation flags */
&dwThreadId)); /* thread id out */
}
int get_best_interface_ip(n2n_edge_t * eee, dec_ip_str_t ip_addr){
DWORD interface_index = -1;
DWORD dwRetVal = 0;
PIP_ADAPTER_INFO pAdapterInfo = NULL, pAdapter = NULL;
macstr_t mac_buf;
ULONG ulOutBufLen = sizeof(IP_ADAPTER_INFO);
dwRetVal = GetBestInterface(*(IPAddr*)(&eee->curr_sn->sock.addr.v4), &interface_index);
if(dwRetVal != NO_ERROR) return -1;
pAdapterInfo = (PIP_ADAPTER_INFO)malloc(ulOutBufLen);
if (pAdapterInfo == NULL) {
traceEvent(TRACE_INFO, "Error allocating memory needed to call GetAdaptersInfo\n");
return -1;
}
dwRetVal = GetAdaptersInfo(pAdapterInfo, &ulOutBufLen);
if(dwRetVal == ERROR_BUFFER_OVERFLOW){
pAdapterInfo = (PIP_ADAPTER_INFO)realloc(pAdapterInfo, ulOutBufLen);
if (pAdapterInfo == NULL) {
traceEvent(TRACE_INFO, "Error allocating memory needed to call GetAdaptersInfo\n");
return -1;
}
}
dwRetVal = GetAdaptersInfo(pAdapterInfo, &ulOutBufLen);
// hexdump((uint8_t*)pAdapterInfo, ulOutBufLen);
if (dwRetVal == NO_ERROR) {
for(pAdapter = pAdapterInfo; pAdapter != NULL; pAdapter = pAdapter->Next){
if (pAdapter->Index != interface_index) continue;
traceEvent(TRACE_DEBUG, "Adapter Index: %ld\n", pAdapter->Index);
traceEvent(TRACE_DEBUG, "Combo Index: %ld\n", pAdapter->ComboIndex);
traceEvent(TRACE_DEBUG, "Adapter Name: %s\n", pAdapter->AdapterName);
traceEvent(TRACE_DEBUG, "Adapter Desc: %s\n", pAdapter->Description);
traceEvent(TRACE_DEBUG, "Adapter Type: %u\n", pAdapter->Type);
macaddr_str(mac_buf, pAdapter->Address);
traceEvent(TRACE_DEBUG, "Adapter Addr: %s\n", mac_buf);
traceEvent(TRACE_DEBUG, "DHCP Enabled: %u\n", pAdapter->DhcpEnabled);
traceEvent(TRACE_DEBUG, "DHCP Server: %s\n", pAdapter->DhcpServer.IpAddress.String);
traceEvent(TRACE_DEBUG, "IP Address: %s\n", pAdapter->IpAddressList.IpAddress.String);
traceEvent(TRACE_DEBUG, "IP Mask: %s\n", pAdapter->IpAddressList.IpMask.String);
traceEvent(TRACE_DEBUG, "Gateway: %s\n", pAdapter->GatewayList.IpAddress.String);
strncpy(ip_addr, pAdapter->IpAddressList.IpAddress.String, sizeof(dec_ip_str_t)-1);
}
}
else {
traceEvent(TRACE_WARNING, "GetAdaptersInfo failed with error: %d\n", dwRetVal);
}
if (pAdapterInfo != NULL){
free(pAdapterInfo);
pAdapterInfo = NULL;
}
return 0;
}
#endif