Custom Broadcasts improvement to add support for specifying ports
							parent
							
								
									faf15e5d88
								
							
						
					
					
						commit
						02195f5636
					
				| 
						 | 
					@ -308,7 +308,7 @@ static int receive_packet(sock_t sock, IP_PORT *ip_port, char *data, unsigned lo
 | 
				
			||||||
    return -1;
 | 
					    return -1;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static bool send_broadcasts(sock_t sock, uint16 port, char *data, unsigned long length, std::vector<uint32_t> *custom_broadcasts)
 | 
					static bool send_broadcasts(sock_t sock, uint16 port, char *data, unsigned long length, std::vector<IP_PORT> *custom_broadcasts)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    static std::chrono::high_resolution_clock::time_point last_get_broadcast_info;
 | 
					    static std::chrono::high_resolution_clock::time_point last_get_broadcast_info;
 | 
				
			||||||
    if (number_broadcasts < 0 || check_timedout(last_get_broadcast_info, 60.0)) {
 | 
					    if (number_broadcasts < 0 || check_timedout(last_get_broadcast_info, 60.0)) {
 | 
				
			||||||
| 
						 | 
					@ -338,11 +338,8 @@ static bool send_broadcasts(sock_t sock, uint16 port, char *data, unsigned long
 | 
				
			||||||
     * This is useful in cases of undetected network interfaces
 | 
					     * This is useful in cases of undetected network interfaces
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    PRINT_DEBUG("start custom broadcasts\n");
 | 
					    PRINT_DEBUG("start custom broadcasts\n");
 | 
				
			||||||
    IP_PORT custom_targeted_broadcast;
 | 
					    for(auto &addr : *custom_broadcasts) {
 | 
				
			||||||
    custom_targeted_broadcast.port = port;
 | 
					        send_packet_to(sock, addr, data, length);
 | 
				
			||||||
    for(auto &ip : *custom_broadcasts) {
 | 
					 | 
				
			||||||
        custom_targeted_broadcast.ip = ip;
 | 
					 | 
				
			||||||
        send_packet_to(sock, custom_targeted_broadcast, data, length);
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    PRINT_DEBUG("end custom broadcasts\n");
 | 
					    PRINT_DEBUG("end custom broadcasts\n");
 | 
				
			||||||
| 
						 | 
					@ -487,12 +484,20 @@ static void socket_timeouts(struct TCP_Socket &socket, double extra_time)
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
std::set<uint32> Networking::resolve_ip(std::string dns)
 | 
					std::set<IP_PORT> Networking::resolve_ip(std::string dns)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    run_at_startup();
 | 
					    run_at_startup();
 | 
				
			||||||
    std::set<uint32> ips;
 | 
					    std::set<IP_PORT> ips;
 | 
				
			||||||
    struct addrinfo* result = NULL;
 | 
					    struct addrinfo* result = NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    uint16 port = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    auto port_sindex = dns.find(":", 0);
 | 
				
			||||||
 | 
					    if (port_sindex != std::string::npos) {
 | 
				
			||||||
 | 
					        port = (uint16)atoi(dns.substr(port_sindex + 1).c_str());
 | 
				
			||||||
 | 
					        dns = dns.substr(0, port_sindex);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (getaddrinfo(dns.c_str(), NULL, NULL, &result) == 0) {
 | 
					    if (getaddrinfo(dns.c_str(), NULL, NULL, &result) == 0) {
 | 
				
			||||||
        for (struct addrinfo *res = result; res != NULL; res = res->ai_next) {
 | 
					        for (struct addrinfo *res = result; res != NULL; res = res->ai_next) {
 | 
				
			||||||
            PRINT_DEBUG("%u %u\n", res->ai_addrlen, res->ai_family);
 | 
					            PRINT_DEBUG("%u %u\n", res->ai_addrlen, res->ai_family);
 | 
				
			||||||
| 
						 | 
					@ -500,7 +505,10 @@ std::set<uint32> Networking::resolve_ip(std::string dns)
 | 
				
			||||||
                struct sockaddr_in *ipv4 = (struct sockaddr_in *)res->ai_addr;
 | 
					                struct sockaddr_in *ipv4 = (struct sockaddr_in *)res->ai_addr;
 | 
				
			||||||
                uint32 ip;
 | 
					                uint32 ip;
 | 
				
			||||||
                memcpy(&ip, &ipv4->sin_addr, sizeof(ip));
 | 
					                memcpy(&ip, &ipv4->sin_addr, sizeof(ip));
 | 
				
			||||||
                ips.insert(ntohl(ip));
 | 
					                IP_PORT addr;
 | 
				
			||||||
 | 
					                addr.ip = ntohl(ip);
 | 
				
			||||||
 | 
					                addr.port = port;
 | 
				
			||||||
 | 
					                ips.insert(addr);
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
| 
						 | 
					@ -733,7 +741,7 @@ bool Networking::handle_low_level_udp(Common_Message *msg, IP_PORT ip_port)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define NUM_TCP_WAITING 128
 | 
					#define NUM_TCP_WAITING 128
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Networking::Networking(CSteamID id, uint32 appid, uint16 port, std::set<uint32_t> *custom_broadcasts, bool disable_sockets)
 | 
					Networking::Networking(CSteamID id, uint32 appid, uint16 port, std::set<IP_PORT> *custom_broadcasts, bool disable_sockets)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    tcp_port = udp_port = port;
 | 
					    tcp_port = udp_port = port;
 | 
				
			||||||
    own_ip = 0x7F000001;
 | 
					    own_ip = 0x7F000001;
 | 
				
			||||||
| 
						 | 
					@ -749,7 +757,11 @@ Networking::Networking(CSteamID id, uint32 appid, uint16 port, std::set<uint32_t
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (custom_broadcasts) {
 | 
					    if (custom_broadcasts) {
 | 
				
			||||||
        std::transform(custom_broadcasts->begin(), custom_broadcasts->end(), std::back_inserter(this->custom_broadcasts), [](uint32 ip) {return htonl(ip);});
 | 
					        std::transform(custom_broadcasts->begin(), custom_broadcasts->end(), std::back_inserter(this->custom_broadcasts), [](IP_PORT addr) {addr.ip = htonl(addr.ip); addr.port = htons(addr.port); return addr; });
 | 
				
			||||||
 | 
					        for (auto& addr : this->custom_broadcasts) {
 | 
				
			||||||
 | 
					            if (addr.port == htons(0))
 | 
				
			||||||
 | 
					                addr.port = htons(port);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    run_at_startup();
 | 
					    run_at_startup();
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -38,6 +38,10 @@ typedef int sock_t;
 | 
				
			||||||
struct IP_PORT {
 | 
					struct IP_PORT {
 | 
				
			||||||
    uint32 ip;
 | 
					    uint32 ip;
 | 
				
			||||||
    uint16 port;
 | 
					    uint16 port;
 | 
				
			||||||
 | 
					    bool operator <(const IP_PORT& other) const
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        return (ip < other.ip) || (ip == other.ip && port < other.port);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct Network_Callback {
 | 
					struct Network_Callback {
 | 
				
			||||||
| 
						 | 
					@ -103,7 +107,7 @@ class Networking {
 | 
				
			||||||
    std::vector<CSteamID> ids;
 | 
					    std::vector<CSteamID> ids;
 | 
				
			||||||
    uint32 appid;
 | 
					    uint32 appid;
 | 
				
			||||||
    std::chrono::high_resolution_clock::time_point last_broadcast;
 | 
					    std::chrono::high_resolution_clock::time_point last_broadcast;
 | 
				
			||||||
    std::vector<uint32_t> custom_broadcasts;
 | 
					    std::vector<IP_PORT> custom_broadcasts;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    std::vector<struct TCP_Socket> accepted;
 | 
					    std::vector<struct TCP_Socket> accepted;
 | 
				
			||||||
    std::recursive_mutex mutex;
 | 
					    std::recursive_mutex mutex;
 | 
				
			||||||
| 
						 | 
					@ -120,8 +124,8 @@ class Networking {
 | 
				
			||||||
public:
 | 
					public:
 | 
				
			||||||
    //NOTE: for all functions ips/ports are passed/returned in host byte order
 | 
					    //NOTE: for all functions ips/ports are passed/returned in host byte order
 | 
				
			||||||
    //ex: 127.0.0.1 should be passed as 0x7F000001
 | 
					    //ex: 127.0.0.1 should be passed as 0x7F000001
 | 
				
			||||||
    static std::set<uint32> resolve_ip(std::string dns);
 | 
					    static std::set<IP_PORT> resolve_ip(std::string dns);
 | 
				
			||||||
    Networking(CSteamID id, uint32 appid, uint16 port, std::set<uint32_t> *custom_broadcasts, bool disable_sockets);
 | 
					    Networking(CSteamID id, uint32 appid, uint16 port, std::set<IP_PORT> *custom_broadcasts, bool disable_sockets);
 | 
				
			||||||
    void addListenId(CSteamID id);
 | 
					    void addListenId(CSteamID id);
 | 
				
			||||||
    void setAppID(uint32 appid);
 | 
					    void setAppID(uint32 appid);
 | 
				
			||||||
    void Run();
 | 
					    void Run();
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -20,6 +20,8 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "base.h"
 | 
					#include "base.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct IP_PORT;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct DLC_entry {
 | 
					struct DLC_entry {
 | 
				
			||||||
    AppId_t appID;
 | 
					    AppId_t appID;
 | 
				
			||||||
    std::string name;
 | 
					    std::string name;
 | 
				
			||||||
| 
						 | 
					@ -125,7 +127,7 @@ public:
 | 
				
			||||||
    bool createUnknownLeaderboards() { return create_unknown_leaderboards; }
 | 
					    bool createUnknownLeaderboards() { return create_unknown_leaderboards; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    //custom broadcasts
 | 
					    //custom broadcasts
 | 
				
			||||||
    std::set<uint32> custom_broadcasts;
 | 
					    std::set<IP_PORT> custom_broadcasts;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    //stats
 | 
					    //stats
 | 
				
			||||||
    std::map<std::string, Stat_config> getStats() { return stats; }
 | 
					    std::map<std::string, Stat_config> getStats() { return stats; }
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -28,7 +28,7 @@ static void consume_bom(std::ifstream &input)
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void load_custom_broadcasts(std::string broadcasts_filepath, std::set<uint32> &custom_broadcasts)
 | 
					static void load_custom_broadcasts(std::string broadcasts_filepath, std::set<IP_PORT> &custom_broadcasts)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    PRINT_DEBUG("Broadcasts file path: %s\n", broadcasts_filepath.c_str());
 | 
					    PRINT_DEBUG("Broadcasts file path: %s\n", broadcasts_filepath.c_str());
 | 
				
			||||||
    std::ifstream broadcasts_file(utf8_decode(broadcasts_filepath));
 | 
					    std::ifstream broadcasts_file(utf8_decode(broadcasts_filepath));
 | 
				
			||||||
| 
						 | 
					@ -36,7 +36,7 @@ static void load_custom_broadcasts(std::string broadcasts_filepath, std::set<uin
 | 
				
			||||||
    if (broadcasts_file.is_open()) {
 | 
					    if (broadcasts_file.is_open()) {
 | 
				
			||||||
        std::string line;
 | 
					        std::string line;
 | 
				
			||||||
        while (std::getline(broadcasts_file, line)) {
 | 
					        while (std::getline(broadcasts_file, line)) {
 | 
				
			||||||
            std::set<uint32> ips = Networking::resolve_ip(line);
 | 
					            std::set<IP_PORT> ips = Networking::resolve_ip(line);
 | 
				
			||||||
            custom_broadcasts.insert(ips.begin(), ips.end());
 | 
					            custom_broadcasts.insert(ips.begin(), ips.end());
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
| 
						 | 
					@ -204,7 +204,7 @@ uint32 create_localstorage_settings(Settings **settings_client_out, Settings **s
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Custom broadcasts
 | 
					    // Custom broadcasts
 | 
				
			||||||
    std::set<uint32> custom_broadcasts;
 | 
					    std::set<IP_PORT> custom_broadcasts;
 | 
				
			||||||
    load_custom_broadcasts(local_storage->get_global_settings_path() + "custom_broadcasts.txt", custom_broadcasts);
 | 
					    load_custom_broadcasts(local_storage->get_global_settings_path() + "custom_broadcasts.txt", custom_broadcasts);
 | 
				
			||||||
    load_custom_broadcasts(Local_Storage::get_game_settings_path() + "custom_broadcasts.txt", custom_broadcasts);
 | 
					    load_custom_broadcasts(Local_Storage::get_game_settings_path() + "custom_broadcasts.txt", custom_broadcasts);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue