Ultima modifica:
La guida di oggi aiuterà spero molti di voi a utilizzare i files 40k su una rete di casa, senza dover usare hamachi o buttare soldi in servizi esterni. E’ necessario però avere una connessione fissa a casa, non ho provato con l’hotspot del telefonino (sicuramente si può anche li ma non garantisco non avendo provato). Serve inoltre avere i sorgenti dei propri eseguibili (game, db, client), non averli non è mai una buona idea. Sfrutteremo inoltre il servizio NO-IP, perchè do per scontato che non abbiate un indirizzo IP esterno statico.
Il tutto è stato eseguito con successo con Freebsd 9.2 ma posso dire che quasi sicuramente non ci saranno problemi anche con le versioni successive, eccezion fatta per la ricerca che dovrete fare dei diversi comandi e tasti di impostazione.
CONFIGURAZIONE SCHEDA DI RETE
Aprite le configurazioni della macchina, prima ancora di avviarla, e andate nelle impostazioni di rete:
Io ho selezionata la chiavetta usb esterna che vedete come prima scelta, ad altri non c’è, e trovano solo la seconda, o ne hanno altre: dovete selezionare la scheda di rete che usate per connettervi ad internet (penso che la Family Controller vada bene se siete connessi con cavo ethernet ma è solo una supposizione che sto facendo, potrebbe essere una cazzata, provate e fatemi sapere, aggiorno la guida in caso).
Ok, ora potete accendere la macchina virtuale.
Recatevi alla macchina virtuale avviata e digitate “sysinstall” (o bsdinstall per 10.3 e successive) per impostare le configurazioni di rete: Configure → Networking → Interfaces → em0 (no ipv6 e DHCP)
Le impostazioni che utilizzo io sono queste. Concentratevi sui seguenti campi:
Commentiamo: i più attenti noteranno che prima ho messo l’IP che terminava in 17, mentre qui termina in 253. Il motivo è semplicemente che nelle configurazioni di VBOX (virtualbox) ho reinserito a mano l’IP e mi sono scordato quale fosse, era 253. Poi niente avete le porte del mio piccolo privatino da test bucatemi tutto. No scherzo, guardate come ho impostato io e quali porte ho aperto, più o meno c’è da fare così (non ho testato bene quali porte siano effettivamente necessarie, ad esempio le p2p le aprivo prima con una modifica in hamachi, e le ho tenute perché mi andava, ma potete tranquillamente provare ad aprire solo le normali e vedere se funziona, e in caso comunicatelo, o chi si intende bene di reti magari può dire come andrebbe fatto e motivare, in tal caso aggiorno la guida).
Ok, a questo punto la configurazione della rete è pronta, uscite dalle configurazioni con OK → Cancel → Cancel → Exit install.
Rendete quindi le impostazioni effettive, io utilizzo un comando storico:
service netif restart (grazie Arves100)
/etc/rc.d/netif restart
Ma potete tranquillamente fare un reboot credo (anche qui correggetemi se sbaglio).
MODIFICHE DEL CODICE NEI SORGENTI
A questo punto le impostazioni di rete sono a posto, ora c’è da fare qualche modifica nel sorgente game (se non avete i sorgenti del vostro game, db e client buttate quello che avete e procuratevi eseguibili con sorgenti, non siate masochisti), da qui in poi ringrazio @Ikarus_ e @iltizio che hanno sviluppato il codice che vi rilascerò ora.
Recatevi in /common/service.h (o qualunque altro header utilizziate per i defines, gli interruttori per poter attivare o disattivare codice, non implementate mai codice, soprattutto consistente senza interruttori), e aggiungete in un punto qualunque:
Recatevi in /game/src/config.cpp e aggiungete sotto alla definizione di g_szInternalIP
Questo:
Quindi cercate la funzione bool GetIPInfo() e verificate di avere un codice quanto più simile a questo (ora commentiamo i singoli pezzettini):
Il primo pezzettino di codice dice che se la negazione di strncmp (che compara alcuni caratteri di due stringhe) è vera (quindi il valore deve essere 0, e strncmp ritorna 0 quando le due stringhe sono uguali), allora si procede. Operativamente questo significa: se l’ip che mi dai inizia con 192.168 allora io eseguo il codice dopo, quindi è FONDAMENTALE che il vostro IP (locale) inizi con 192.168 e che questo check non sia stato modificato con cose tipo 999.999, altrimenti non loggherete, perché ora lui sta impostando l’ip interno, grazie alla string line copy o come si chiama (strlcpy), che copia netip in g_szInternalIP.
Questo secondo pezzettino è alternativo al primo, nel senso che se avete l’ip locale che inizia con 10. va bene uguale, e avrete anche in questo caso un ip interno settato correttamente,
Questo terzo pezzo invece setta in teoria l’IP esterno, ma come noterete viene copiato sempre netip, quindi avrete in realtà sempre lo stesso IP salvato come “esterno” ed interno. Perché fare così?Boh, funziona ahahah. Questo va oltre le mie conoscenze, quindi se qualcuno vuole dare una spiegazione perché lo sa, o vuole correggere perché è un modo sbagliato di procedere DOVETE farlo, e miglioro la guida. Io l’ho pubblicata così solo perché funziona.
Grazie di nuovo ad @Ikarus_ la risposta è la seguente, sotto spoiler perchè è un approfondimento teorico non obbligatorio per il corretto svolgimento della guida ma sicuramente interessante (c'è sotto ma la integro nella guida in modo che sia tutto insieme, e tra l'altro potevo arrivarci):
Bene ora manca il pezzo più importante. Dopo aver controllato questi pezzi di codice, rimanete nella funzione GetIPInfo() e aggiungete appena sotto questi codici appena controllati:
############### EDIT!! ###############
Più in fondo nelle risposte, un post di @Arves100 suggerisce un modo migliore per la prossima modifica che sta per essere proposta, suggerisco caldamente di visionare tale risposta, che non è stata integrata nella guida, sostituendo il codice da me proposto perchè:
############### FINE ###############
Questo è il codice gentilmente preso in prestito da Ikarus e IlTizio da una discussione di aiuto sempre qui su IF, e tutto quello che fa è prelevare ad ogni avvio del server il vostro IP esterno, e salvarlo in una variabile definita g_szExternPublicIP (che dobbiamo ancora dichiarare ed utilizzare e lo faremo). Qual è la cosa fantastica di questa cosa? Beh semplicemente che se avete una rete nattata, con una frequenza più o meno alta il vostro IP esterno o reale cambierà, e quindi dovreste sempre risettarlo a mano, dal sorgente o dai CONFIG se avete configurato la possibilità di farlo, ma in ogni caso resta un processo manuale. Qui invece avremo la possibilità di far leggere in autonomia alla macchina il vostro IP esterno da un sito, e tutto ciò che dovrete fare per poterlo avere funzionante è installare “curl” sulla vostra macchina, qualora non fosse già presente.
Per installare curl ci sono 60053 modi, io ho usato “pkg install curl” ma cercando su internet se ne trovano a valanghe. Continuiamo con la guida.
Recatevi in config.h e aggiungete sotto a:
questo:
Recatevi in desc_client.cpp, nel metodo bool CLIENT_DESC::Connect(int iPhaseWhenSucceed)
E sostituite:
Con:
Se ho interpretato bene questo codice, l’intenzione era quella di passare l’ip interno per le connessioni P2P che non usano ovviamente quello esterno.
Recatevi quindi un po’ più in basso e sostituite:
con:
E ancora un po’ più in basso sostituite:
con:
Avete finito anche qua, ricompilate e montate il nuovo game. All’avvio del server, messaggi di questo tipo (ovviamente insieme al fatto che il server è online e logghiate), indicano che la procedura è stata eseguita correttamente:
Se questo messaggio non viene visualizzato sulla console perchè non vedete tipicamente nessun messaggio all'avvio, provate a controllare il file "autorun.log" che trovate nei vari core (dopo l'avvio del server). Se non trovate questo file ma loggate e funziona tutto non è un problema.
Ultimo ma non per importanza, scaricate DUC e impostatevi un NO-IP gratuito perché sebbene la macchina sia capace indipendentemente di ricavarsi l’IP esterno ogni volta, il client non lo è, e quindi per non dovere ogni volta modificare la root vi conviene averlo. Come andremo quindi ad impostare le varie connessioni?
Facciamo un esempio: Ho la mia bellissima vodafone station, a cui sono collegati:
Se A si vuole collegare al server può entrare sia in locale (127.0.0.1) che con l’ip locale (192.168.1.253 nel mio caso), e questo IP è fisso per la macchina quindi non ci saranno grossi problemi (quindi per il DB metterete l’ip locale e id e pass, idem per il ftp e idem per il root).
Se B si vuole collegare al server può entrare con l’ip interno (anzi DEVE entrare così, non gli sarà possibile entrare con l’IP ESTERNO, quindi per una questione di comodità vi conviene decidere quali pc si collegheranno con IP interno e quali con esterno, non so se mi sono spiegato), quindi mettendo 192.168.1.253.
Se C si vuole collegare dal Burundi, sia a navicat che a winscp che al client non dovrà fare altro che inserire l’indirizzo alfanumerico che è stato registrato su no-ip, quindi che ne so: testmetin2.ddns.net, quando DUC sarà avviato sul pc HOST potrà collegarsi senza problemi.
Ribadisco che pc collegati alla station su cui si poggia la macchina virtuale DEVONO entrare con l’IP interno, o almeno i test mi portano a dire questo. Testate e ditemi come va, in caso di problemi scrivete sotto e aggiorno la guida. Se ci sono altre guide migliori mi scuso e cancello, se avete critiche soprattutto inutili fatele, altrimenti ci annoiamo. Potrei essermi scordato qualche passaggio perché ho partorito questa idea in più tempi, e quindi alcune modifiche le ho fatte recentemente, altre secoli addietro.
Tengo a precisare che la guida deriva da varie unioni di richieste di aiuto su questo forum e quindi i singoli passaggi potrebbero essere reperibili nelle varie richieste, oltre a guide proprio che però secondo me non coprono l'argomento in maniera esaustiva in quanto, ad oggi, esistono ancora richieste per loggare correttamente sul proprio server e far loggare amici.
Buona giornata a tutti.
Il tutto è stato eseguito con successo con Freebsd 9.2 ma posso dire che quasi sicuramente non ci saranno problemi anche con le versioni successive, eccezion fatta per la ricerca che dovrete fare dei diversi comandi e tasti di impostazione.
CONFIGURAZIONE SCHEDA DI RETE
Aprite le configurazioni della macchina, prima ancora di avviarla, e andate nelle impostazioni di rete:
Io ho selezionata la chiavetta usb esterna che vedete come prima scelta, ad altri non c’è, e trovano solo la seconda, o ne hanno altre: dovete selezionare la scheda di rete che usate per connettervi ad internet (penso che la Family Controller vada bene se siete connessi con cavo ethernet ma è solo una supposizione che sto facendo, potrebbe essere una cazzata, provate e fatemi sapere, aggiorno la guida in caso).
Ok, ora potete accendere la macchina virtuale.
Recatevi alla macchina virtuale avviata e digitate “sysinstall” (o bsdinstall per 10.3 e successive) per impostare le configurazioni di rete: Configure → Networking → Interfaces → em0 (no ipv6 e DHCP)
Le impostazioni che utilizzo io sono queste. Concentratevi sui seguenti campi:
- Gateway: qui si mette appunto il gateway della vostra connessione di casa, ovviamente dell’indirizzo locale, dato che avrete quasi certamente una rete nattata;
- Name Server: qui si mette un DNS funzionante (io ho preso in prestito quello di google);
- IPv4 address: qui si mette l’indirizzo che sarà SOLO della macchina e dovrà essere SEMPRE quello! Quindi bisogna che questo indirizzo non abbia l’ultima tripletta di numeri troppo piccola (192.168.1.2) perché rischiate che a PC spento questo IP venga assegnato ad un altro dispositivo, causando piccoli fastidi di conflitti IP, e dovrete successivamente recarvi alla pagina di impostazioni del router, digitando il gateway su un qualsiasi browser (http://192.168.1.1), in modo da poter mettere in atto il portforwarding su questo ip.
Commentiamo: i più attenti noteranno che prima ho messo l’IP che terminava in 17, mentre qui termina in 253. Il motivo è semplicemente che nelle configurazioni di VBOX (virtualbox) ho reinserito a mano l’IP e mi sono scordato quale fosse, era 253. Poi niente avete le porte del mio piccolo privatino da test bucatemi tutto. No scherzo, guardate come ho impostato io e quali porte ho aperto, più o meno c’è da fare così (non ho testato bene quali porte siano effettivamente necessarie, ad esempio le p2p le aprivo prima con una modifica in hamachi, e le ho tenute perché mi andava, ma potete tranquillamente provare ad aprire solo le normali e vedere se funziona, e in caso comunicatelo, o chi si intende bene di reti magari può dire come andrebbe fatto e motivare, in tal caso aggiorno la guida).
Ok, a questo punto la configurazione della rete è pronta, uscite dalle configurazioni con OK → Cancel → Cancel → Exit install.
Rendete quindi le impostazioni effettive
service netif restart (grazie Arves100)
Ma potete tranquillamente fare un reboot credo (anche qui correggetemi se sbaglio).
MODIFICHE DEL CODICE NEI SORGENTI
A questo punto le impostazioni di rete sono a posto, ora c’è da fare qualche modifica nel sorgente game (se non avete i sorgenti del vostro game, db e client buttate quello che avete e procuratevi eseguibili con sorgenti, non siate masochisti), da qui in poi ringrazio @Ikarus_ e @iltizio che hanno sviluppato il codice che vi rilascerò ora.
Recatevi in /common/service.h (o qualunque altro header utilizziate per i defines, gli interruttori per poter attivare o disattivare codice, non implementate mai codice, soprattutto consistente senza interruttori), e aggiungete in un punto qualunque:
Codice:
#define FIX_LOGIN
Recatevi in /game/src/config.cpp e aggiungete sotto alla definizione di g_szInternalIP
char g_szInternalIP[16] = "0";
Questo:
Codice:
#ifdef FIX_LOGIN
char g_szExternPublicIP[16] = "0";
#endif
Quindi cercate la funzione bool GetIPInfo() e verificate di avere un codice quanto più simile a questo (ora commentiamo i singoli pezzettini):
Codice:
if (!strncmp(netip, "192.168", 7))
{
strlcpy(g_szInternalIP, netip, sizeof(g_szInternalIP));
#ifndef __WIN32__
fprintf(stderr, "INTERNAL_IP: %s interface %s\n", netip, ifap->ifa_name);
#else
fprintf(stderr, "INTERNAL_IP: %s\n", netip);
sys_log(0, "INTERNAL_IP: %s\n", g_szInternalIP);
#endif
}
Il primo pezzettino di codice dice che se la negazione di strncmp (che compara alcuni caratteri di due stringhe) è vera (quindi il valore deve essere 0, e strncmp ritorna 0 quando le due stringhe sono uguali), allora si procede. Operativamente questo significa: se l’ip che mi dai inizia con 192.168 allora io eseguo il codice dopo, quindi è FONDAMENTALE che il vostro IP (locale) inizi con 192.168 e che questo check non sia stato modificato con cose tipo 999.999, altrimenti non loggherete, perché ora lui sta impostando l’ip interno, grazie alla string line copy o come si chiama (strlcpy), che copia netip in g_szInternalIP.
Codice:
else if (!strncmp(netip, "10.", 3))
{
strlcpy(g_szInternalIP, netip, sizeof(g_szInternalIP));
#ifndef __WIN32__
fprintf(stderr, "INTERNAL_IP: %s interface %s\n", netip, ifap->ifa_name);
#else
fprintf(stderr, "INTERNAL_IP: %s\n", netip);
sys_log(0, "INTERNAL_IP2: %s\n", g_szInternalIP);
#endif
}
Questo secondo pezzettino è alternativo al primo, nel senso che se avete l’ip locale che inizia con 10. va bene uguale, e avrete anche in questo caso un ip interno settato correttamente,
Codice:
if (g_szPublicIP[0] == '0')
{
strlcpy(g_szPublicIP, netip, sizeof(g_szPublicIP));
#ifndef __WIN32__
fprintf(stderr, "PUBLIC_IP: %s interface %s\n", netip, ifap->ifa_name);
#else
fprintf(stderr, "PUBLIC_IP: %s\n", netip);
sys_log(0, "PUBLIC_IP: %s\n", g_szPublicIP);
#endif
}
Questo terzo pezzo invece setta in teoria l’IP esterno, ma come noterete viene copiato sempre netip, quindi avrete in realtà sempre lo stesso IP salvato come “esterno” ed interno. Perché fare così?
Grazie di nuovo ad @Ikarus_ la risposta è la seguente, sotto spoiler perchè è un approfondimento teorico non obbligatorio per il corretto svolgimento della guida ma sicuramente interessante (c'è sotto ma la integro nella guida in modo che sia tutto insieme, e tra l'altro potevo arrivarci):
"Se hai notato prima di copiare in public ip l'ip della scheda di rete checka se l'ip pubblico è una stringa vuota (se il terminatore nullo è al primo posto nell'array) Questo perchè "g_szPublicIP" è in realtà destinato a essere usato per salvarci l'ip inserito nel file config del core in booting. Questo vuol dire che se tu non hai messo bind_ip nel config, allora viene copiato l'ip preso dalla scheda di rete (che non è quello "interno", lo è solo nel caso di una NAT), che nei dedicati e/o nei vps con ip dedicato è l'ip pubblico. E' un pò come dire, non mi hai assegnato un ip pubblico quindi presumo che possa prenderlo dalla scheda di rete. Se invece hai messo il bind_ip nel config , g_szPublicIP conterrà quell'ip."
In una rete nattata il "g_szPublicIP" non può contenere l'IP esterno (provato tempo fa), mentre nel caso del dedicato, con IP esterno statico (si collega alla rete direttamente con l'indirizzo esterno), ecco che questa variabile assume una serie di caratteri diversi da "g_szInternalIP". È comunque importante che venga assegnato un indirizzo a "g_szPublicIP" quindi assicuratevi che in un modo o nell'altro ciò venga fatto (mi pare desse problemi di login se stringa nulla).]
In una rete nattata il "g_szPublicIP" non può contenere l'IP esterno (provato tempo fa), mentre nel caso del dedicato, con IP esterno statico (si collega alla rete direttamente con l'indirizzo esterno), ecco che questa variabile assume una serie di caratteri diversi da "g_szInternalIP". È comunque importante che venga assegnato un indirizzo a "g_szPublicIP" quindi assicuratevi che in un modo o nell'altro ciò venga fatto (mi pare desse problemi di login se stringa nulla).]
Bene ora manca il pezzo più importante. Dopo aver controllato questi pezzi di codice, rimanete nella funzione GetIPInfo() e aggiungete appena sotto questi codici appena controllati:
############### EDIT!! ###############
Più in fondo nelle risposte, un post di @Arves100 suggerisce un modo migliore per la prossima modifica che sta per essere proposta, suggerisco caldamente di visionare tale risposta, che non è stata integrata nella guida, sostituendo il codice da me proposto perchè:
- Non sono ancora riuscito a compilare con successo sulla macchina con gcc8 (c++ 11 se non 14) e freebsd 11.3
- Tengo conto che probabilmente molta gente che seguirà la guida non avrà aggiornato gcc o freebsd e il codice proposto da Arves richiede l'aggiornamento del compilatore
- Al momento non sono in grado di integrarlo
############### FINE ###############
Codice:
#ifdef FIX_LOGIN
FILE *fp;
fp = popen("/usr/local/bin/curl ipinfo.io/ip", "r");
fgets(g_szExternPublicIP, sizeof(g_szExternPublicIP), fp);
pclose(fp);
sys_log(0, "EXTERN_NAT_IP : %s for nat fix. \n", g_szExternPublicIP);
#endif
Questo è il codice gentilmente preso in prestito da Ikarus e IlTizio da una discussione di aiuto sempre qui su IF, e tutto quello che fa è prelevare ad ogni avvio del server il vostro IP esterno, e salvarlo in una variabile definita g_szExternPublicIP (che dobbiamo ancora dichiarare ed utilizzare e lo faremo). Qual è la cosa fantastica di questa cosa? Beh semplicemente che se avete una rete nattata, con una frequenza più o meno alta il vostro IP esterno o reale cambierà, e quindi dovreste sempre risettarlo a mano, dal sorgente o dai CONFIG se avete configurato la possibilità di farlo, ma in ogni caso resta un processo manuale. Qui invece avremo la possibilità di far leggere in autonomia alla macchina il vostro IP esterno da un sito, e tutto ciò che dovrete fare per poterlo avere funzionante è installare “curl” sulla vostra macchina, qualora non fosse già presente.
Per installare curl ci sono 60053 modi, io ho usato “pkg install curl” ma cercando su internet se ne trovano a valanghe. Continuiamo con la guida.
Recatevi in config.h e aggiungete sotto a:
extern char g_szInternalIP[16];
questo:
Codice:
#ifdef FIX_LOGIN
extern char g_szExternPublicIP[16];
#endif
Recatevi in desc_client.cpp, nel metodo bool CLIENT_DESC::Connect(int iPhaseWhenSucceed)
E sostituite:
m_sock = socket_connect(m_stHost.c_str(), m_wPort);
Con:
Codice:
#ifdef FIX_LOGIN
if (iPhaseWhenSucceed == PHASE_P2P)
{
sys_log(0, "Ikarus : IP to connect: %s , Port: %d\n", g_szInternalIP, m_wPort);
m_sock = socket_connect(g_szInternalIP, m_wPort);
}
else
{
m_sock = socket_connect(m_stHost.c_str(), m_wPort);
}
#else
m_sock = socket_connect(m_stHost.c_str(), m_wPort);
#endif
Se ho interpretato bene questo codice, l’intenzione era quella di passare l’ip interno per le connessioni P2P che non usano ovviamente quello esterno.
Recatevi quindi un po’ più in basso e sostituite:
memcpy(p.szIP, g_szPublicIP, 16);
con:
Codice:
#ifdef FIX_LOGIN
memcpy(p.szIP, g_szExternPublicIP, 16);
#else
memcpy(p.szIP, g_szPublicIP, 16);
#endif
E ancora un po’ più in basso sostituite:
strlcpy(p.szPublicIP, g_szPublicIP, sizeof(p.szPublicIP));
con:
Codice:
#ifdef FIX_LOGIN
strlcpy(p.szPublicIP, g_szExternPublicIP, sizeof(p.szPublicIP));
#else
strlcpy(p.szPublicIP, g_szPublicIP, sizeof(p.szPublicIP));
#endif
Avete finito anche qua, ricompilate e montate il nuovo game. All’avvio del server, messaggi di questo tipo (ovviamente insieme al fatto che il server è online e logghiate), indicano che la procedura è stata eseguita correttamente:
Se questo messaggio non viene visualizzato sulla console perchè non vedete tipicamente nessun messaggio all'avvio, provate a controllare il file "autorun.log" che trovate nei vari core (dopo l'avvio del server). Se non trovate questo file ma loggate e funziona tutto non è un problema.
Ultimo ma non per importanza, scaricate DUC e impostatevi un NO-IP gratuito perché sebbene la macchina sia capace indipendentemente di ricavarsi l’IP esterno ogni volta, il client non lo è, e quindi per non dovere ogni volta modificare la root vi conviene averlo. Come andremo quindi ad impostare le varie connessioni?
Facciamo un esempio: Ho la mia bellissima vodafone station, a cui sono collegati:
- Un PC fisso, che ospita la macchina virtuale e chiamaremo A;
- Un portatile, che chiameremo B.
Se A si vuole collegare al server può entrare sia in locale (127.0.0.1) che con l’ip locale (192.168.1.253 nel mio caso), e questo IP è fisso per la macchina quindi non ci saranno grossi problemi (quindi per il DB metterete l’ip locale e id e pass, idem per il ftp e idem per il root).
Se B si vuole collegare al server può entrare con l’ip interno (anzi DEVE entrare così, non gli sarà possibile entrare con l’IP ESTERNO, quindi per una questione di comodità vi conviene decidere quali pc si collegheranno con IP interno e quali con esterno, non so se mi sono spiegato), quindi mettendo 192.168.1.253.
Se C si vuole collegare dal Burundi, sia a navicat che a winscp che al client non dovrà fare altro che inserire l’indirizzo alfanumerico che è stato registrato su no-ip, quindi che ne so: testmetin2.ddns.net, quando DUC sarà avviato sul pc HOST potrà collegarsi senza problemi.
Ribadisco che pc collegati alla station su cui si poggia la macchina virtuale DEVONO entrare con l’IP interno, o almeno i test mi portano a dire questo. Testate e ditemi come va, in caso di problemi scrivete sotto e aggiorno la guida. Se ci sono altre guide migliori mi scuso e cancello, se avete critiche soprattutto inutili fatele, altrimenti ci annoiamo. Potrei essermi scordato qualche passaggio perché ho partorito questa idea in più tempi, e quindi alcune modifiche le ho fatte recentemente, altre secoli addietro.
Tengo a precisare che la guida deriva da varie unioni di richieste di aiuto su questo forum e quindi i singoli passaggi potrebbero essere reperibili nelle varie richieste, oltre a guide proprio che però secondo me non coprono l'argomento in maniera esaustiva in quanto, ad oggi, esistono ancora richieste per loggare correttamente sul proprio server e far loggare amici.
Buona giornata a tutti.