****: stop supporting ICMPing on macOS

This commit is contained in:
Qv2ray-dev 2020-05-21 17:05:34 +08:00
parent eab84e40b4
commit 7885966cba
3 changed files with 30 additions and 19 deletions

View File

@ -1 +1 @@
5487 5488

View File

@ -100,38 +100,37 @@ namespace Qv2ray::components::latency::icmping
return { 0, "EPING_SOCK:" + QObject::tr("Socket creation failed") }; return { 0, "EPING_SOCK:" + QObject::tr("Socket creation failed") };
// resolve hostname // resolve hostname
hostent *hname = gethostbyname(address.toStdString().c_str()); hostent *resolvedAddress = gethostbyname(address.toStdString().c_str());
if (!hname) if (!resolvedAddress)
return { 0, "EPING_HOST: " + QObject::tr("Unresolvable hostname") }; return { 0, "EPING_HOST: " + QObject::tr("Unresolvable hostname") };
// set IP address to ping // set IP address to ping
sockaddr_in addr_ping, *addr; sockaddr_in targetAddress;
memset(&addr_ping, 0, sizeof(addr_ping)); memset(&targetAddress, 0, sizeof(targetAddress));
addr_ping.sin_family = hname->h_addrtype; targetAddress.sin_family = resolvedAddress->h_addrtype;
addr_ping.sin_port = 0; targetAddress.sin_port = 0;
memcpy(&addr_ping.sin_addr, hname->h_addr, hname->h_length); memcpy(&targetAddress.sin_addr, resolvedAddress->h_addr, resolvedAddress->h_length);
addr = &addr_ping;
// prepare echo request packet // prepare echo request packet
icmp req; icmp _icmp_request;
memset(&req, 0, sizeof(req)); memset(&_icmp_request, 0, sizeof(_icmp_request));
req.icmp_type = ICMP_ECHO; _icmp_request.icmp_type = ICMP_ECHO;
req.icmp_hun.ih_idseq.icd_id = 0; // SOCK_DGRAM & 0 => id will be set by kernel _icmp_request.icmp_hun.ih_idseq.icd_id = 0; // SOCK_DGRAM & 0 => id will be set by kernel
unsigned short sent_seq; unsigned short sent_seq;
req.icmp_hun.ih_idseq.icd_seq = sent_seq = seq++; _icmp_request.icmp_hun.ih_idseq.icd_seq = sent_seq = seq++;
req.icmp_cksum = ping_checksum(reinterpret_cast<char *>(&req), sizeof(req)); _icmp_request.icmp_cksum = ping_checksum(reinterpret_cast<char *>(&_icmp_request), sizeof(_icmp_request));
// send echo request // send echo request
gettimeofday(&start, NULL); gettimeofday(&start, NULL);
if (sendto(socketId, &req, sizeof(icmp), 0, (struct sockaddr *) addr, sizeof(*addr)) <= 0) if (sendto(socketId, &_icmp_request, sizeof(icmp), 0, (struct sockaddr *) &targetAddress, sizeof(targetAddress)) <= 0)
return { 0, "EPING_SEND: " + QObject::tr("Sending echo request failed") }; return { 0, "EPING_SEND: " + QObject::tr("Sending echo request failed") };
// receive response (if any) // receive response (if any)
sockaddr_in r_addr; sockaddr_in remove_addr;
slen = sizeof(r_addr); slen = sizeof(remove_addr);
int rlen; int rlen;
icmp resp; icmp resp;
while ((rlen = recvfrom(socketId, &resp, sizeof(icmp), 0, (struct sockaddr *) &r_addr, &slen)) > 0) while ((rlen = recvfrom(socketId, &resp, sizeof(icmp), 0, (struct sockaddr *) &remove_addr, &slen)) > 0)
{ {
gettimeofday(&end, NULL); gettimeofday(&end, NULL);

View File

@ -1012,6 +1012,7 @@ void PreferencesWindow::on_qvProxyCustomProxy_clicked()
SET_PROXY_UI_ENABLE(true); SET_PROXY_UI_ENABLE(true);
qvProxyNoProxy->setChecked(false); qvProxyNoProxy->setChecked(false);
qvProxySystemProxy->setChecked(false); qvProxySystemProxy->setChecked(false);
qvProxyCustomProxy->setChecked(true);
} }
void PreferencesWindow::on_qvProxySystemProxy_clicked() void PreferencesWindow::on_qvProxySystemProxy_clicked()
@ -1020,6 +1021,7 @@ void PreferencesWindow::on_qvProxySystemProxy_clicked()
SET_PROXY_UI_ENABLE(false); SET_PROXY_UI_ENABLE(false);
qvProxyNoProxy->setChecked(false); qvProxyNoProxy->setChecked(false);
qvProxyCustomProxy->setChecked(false); qvProxyCustomProxy->setChecked(false);
qvProxySystemProxy->setChecked(true);
} }
void PreferencesWindow::on_qvProxyNoProxy_clicked() void PreferencesWindow::on_qvProxyNoProxy_clicked()
@ -1028,6 +1030,7 @@ void PreferencesWindow::on_qvProxyNoProxy_clicked()
SET_PROXY_UI_ENABLE(false); SET_PROXY_UI_ENABLE(false);
qvProxySystemProxy->setChecked(false); qvProxySystemProxy->setChecked(false);
qvProxyCustomProxy->setChecked(false); qvProxyCustomProxy->setChecked(false);
qvProxyNoProxy->setChecked(true);
} }
void PreferencesWindow::on_DnsFreedomCb_stateChanged(int arg1) void PreferencesWindow::on_DnsFreedomCb_stateChanged(int arg1)
@ -1117,11 +1120,20 @@ void PreferencesWindow::on_latencyTCPingRB_clicked()
LOADINGCHECK LOADINGCHECK
CurrentConfig.networkConfig.latencyTestingMethod = TCPING; CurrentConfig.networkConfig.latencyTestingMethod = TCPING;
latencyICMPingRB->setChecked(false); latencyICMPingRB->setChecked(false);
latencyTCPingRB->setChecked(true);
} }
void PreferencesWindow::on_latencyICMPingRB_clicked() void PreferencesWindow::on_latencyICMPingRB_clicked()
{ {
LOADINGCHECK LOADINGCHECK
#ifdef Q_OS_MAC
#warning No ICMPing support on macOS
CurrentConfig.networkConfig.latencyTestingMethod = TCPING;
latencyICMPingRB->setChecked(false);
latencyTCPingRB->setChecked(true);
#else
CurrentConfig.networkConfig.latencyTestingMethod = ICMPING; CurrentConfig.networkConfig.latencyTestingMethod = ICMPING;
latencyICMPingRB->setChecked(true);
latencyTCPingRB->setChecked(false); latencyTCPingRB->setChecked(false);
#endif
} }