Skip to content

macOS ใง Network::IsConnected() ใŒใƒ“ใƒซใƒ‰ใ‚จใƒฉใƒผใซใชใ‚‹ย #1328

@Raclamusi

Description

@Raclamusi

macOS ใง Network::IsConnected() ใ‚’ไฝฟใ†ใจใƒ“ใƒซใƒ‰ใ‚จใƒฉใƒผใซใชใ‚Šใพใ™ใ€‚

Undefined symbol: _SCNetworkReachabilityCreateWithName
Undefined symbol: _SCNetworkReachabilityGetFlags

SCNetworkReachability API ใŒๅปƒๆญขใ•ใ‚ŒใŸใ‚ˆใ†ใงใ™ใ€‚
https://developer.apple.com/documentation/systemconfiguration/scnetworkreachability-g7d

Linux ็‰ˆใฎๅฎŸ่ฃ…ใ‚’่ฉฆใ—ใฆใฟใพใ—ใŸใŒใ€ awdl0, llw0, utun0, utun1, ... ใฎใ‚ˆใ†ใชใ‚คใƒณใ‚ฟใƒผใƒ•ใ‚งใƒผใ‚นใŒๅผ•ใฃๆŽ›ใ‹ใ‚Šใ€ใ‚คใƒณใ‚ฟใƒผใƒใƒƒใƒˆใซๆŽฅ็ถšใ—ใฆใ„ใชใ„็Šถๆ…‹ใงใ‚‚ true ใŒ่ฟ”ใ‚Šใพใ—ใŸใ€‚
๏ผˆใใ‚‚ใใ‚‚ Network::IsConnected() ใ€Œใ‚คใƒณใ‚ฟใƒผใƒใƒƒใƒˆใซๆŽฅ็ถšใ•ใ‚Œใฆใ„ใ‚‹ใ‹ใ€ใ‚’่ฟ”ใ—ใฆใ„ใ‚‹ใฎใงใ—ใ‚‡ใ†ใ‹๏ผŸใ€€Windows ็‰ˆใ‚„ Linux ็‰ˆใฎๅฎŸ่ฃ…ใฏๅ˜ใซใ€Œใƒใƒƒใƒˆใƒฏใƒผใ‚ฏใซๆŽฅ็ถšใ•ใ‚Œใฆใ„ใ‚‹ใ‹ใ€ใ‚’่ฟ”ใ—ใฆใ„ใ‚‹ใ‚ˆใ†ใซ่ฆ‹ใˆใพใ™ใ€‚๏ผ‰

Linux ็‰ˆใฎๅฎŸ่ฃ… (ifaddrs) ใ‚’่ฉฆใ™ใ‚ณใƒผใƒ‰
# include <Siv3D.hpp>
# include <ifaddrs.h>
# include <net/if.h>
# include <arpa/inet.h>

namespace MyNetwork
{
	bool IsConnected()
	{
		struct ifaddrs* ifaddr;
		if (getifaddrs(&ifaddr) == -1)
		{
			return false;
		}
		
		bool result = false;
		for (struct ifaddrs* ifa = ifaddr; ifa != nullptr; ifa = ifa->ifa_next)
		{
			if (ifa->ifa_addr == nullptr)
			{
				continue;
			}
			
			const int family = ifa->ifa_addr->sa_family;
			
			if (((family == AF_INET )|| (family == AF_INET6))
				&& (not (ifa->ifa_flags & IFF_LOOPBACK)))
			{
				result = true;
				// break;

				// ใƒ‡ใƒใƒƒใ‚ฐ
				{
					String s = Unicode::Widen(ifa->ifa_name);
					if (family == AF_INET)
					{
						s += U": ";
						s += Unicode::Widen(inet_ntoa(reinterpret_cast<struct sockaddr_in*>(ifa->ifa_addr)->sin_addr));
					}
					else if (family == AF_INET6)
					{
						s += U": ";
						std::string buf(INET6_ADDRSTRLEN, U'\0');
						inet_ntop(AF_INET6, &reinterpret_cast<struct sockaddr_in6*>(ifa->ifa_addr)->sin6_addr, buf.data(), INET6_ADDRSTRLEN);
						s += Unicode::Widen(buf);
					}
					Print << s;
				}
			}
		}
		
		freeifaddrs(ifaddr);
		return result;
	}
}

void Main()
{
	Print << Network::EnumerateIPv4Addresses();
	Print << MyNetwork::IsConnected();

	while (System::Update())
	{
	}
}

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions