Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

01.09.2012, 17:28

falscher Hostname mit gethostbyaddr()

Hallo alle zusammen,

Ich bin dabei mir einen eigenen Multiplayer zu erstellen und dazu will ich den Spieler auswählen lassen mit wem er spielt, wie es eben üblich ist.
Nun habe ich es mit einer broadcast Nachricht und recvfrom geschafft seine Adresse zu erhalten. (Die Adresse ist richtig, hab es in der Konsole mit ping überprüft)
Ich möchte allerdings den Hostnamen und nicht seine IP ausgeben.
Also benutze ich gethostbyaddr mit seiner IP und erhalte aber immer nur den Namen von dem PC, wo ich das Programm starte

Mich interessiert ob ihr eine Idee habt, woran das liegen könnte,
ich durchforste derzeit meinen Code fleißig, aber finde den Grund einfach nicht.

MfG setset1994

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

2

01.09.2012, 20:04

Code zeigen bitte.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

3

01.09.2012, 22:26

Kommt sofort:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// "g_pPong->m_pConnection->m_remoteaddr" enthält die richtige IP-Adresse
// Die IP-Adresse stimmt auf jeden Fall, hab sie mal ausgeben lassen und sie war richtig
// nun hol ich mir die Hostdaten, welche aber anscheinend nicht stimmen
struct hostent* remoteHost = gethostbyaddr((char *) &g_pPong->m_pConnection->m_remoteaddr.sin_addr
                                    , sizeof (g_pPong->m_pConnection->m_remoteaddr.sin_addr)
                                    , g_pPong->m_pConnection->m_remoteaddr.sin_family);
if(remoteHost == NULL)
{
    break;
}
                    
//Die Zeile ist für das Problem unwichtig
m_Addr[i] = g_pPong->m_pConnection->m_remoteaddr;

//und hier wird der Hostname in einem mehrdimensionalen char array gespeichert(char m_cNames[20][256])
//das char Array wird später ausgegeben
strcpy(m_cNames[i],remoteHost->h_name);


Wenn ich dann m_cNames(i] (die falsche Klammer hab ich gesetzt, weil der restliche Text sonst kursiv wäre) ausgebe, erhalte ich immer meinen PC-Namen aber nicht den der Adresse.
Die Adresse ist aber auf jedenfall richtig, da ich sie auch zum Testen direkt ausgegeben hatte und sie immer stimmte

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

4

01.09.2012, 22:42

Und was steht in g_pPong->m_pConnection->m_remoteaddr.sin_addr?
Denn das ist eine fixe Variable, kein Array, wie ich es an der Stelle erwartet hätte. Das klingt für mich eher als ob Du da die falsche Adresse übergibst, nämlich Deine lokale, nicht die des Remote-Rechners.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

5

02.09.2012, 14:02

In g_pPong->m_pConnection->m_remoteaddr.sin_addr steckt eben die IP-Adresse im Format "in_addr" aber diese stimmt wie gesagt.

Was mich jetzt noch mehr verwirrt ist die Tatsache, das ich beim letzten Starten den richtigen Computernamen (ich nenne ihn mal PCX) ausgegeben bekam, aber beim starten von PCX bekam ich auch nur den Namen von PCX, trotz anderer IP-Adresse.

Gestern hat mein Programm immer nur den Namen von dem PC ausgegeben wo ich das Programm gestartet habe ausgebenen

Ich weiß nicht ob es eine mögliche Ursache ist, aber alle Rechner von denen ich das Programm gestartet haben hängen am selben Router, vielleicht liegt es daran.

Die IP Adresse kann nicht falsch sein, weil ich hinterher eine TCP-Verbindung zu der Adresse in g_pPong->m_pConnection->m_remoteaddr aufbaue, und der Datenverkehr zwischen den beiden Testrechner klappt.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

6

02.09.2012, 15:51

Tja, mit so wenig Code lässt sich das schlecht beurteilen, ich tippe trotzdem auf einen Fehler bei Deinem Code, nicht am Router oder der Netzwerk-API.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

7

09.09.2012, 11:03

Tut mir Leid das ich ne Weile nicht mehr geantwortet habe,
die Schule hat wieder angefangen, da war ich andersweitig beschäftigt ;) .

Auf jedenfall bin ich bei dem Problem zu neuen Erkenntnisen gekommen.

ich habe meinen Code leicht verändert, so dass er mir den Hostnamen und seine IP ausgibt:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
struct hostent* remoteHost = gethostbyaddr((const char *) &g_pPong->m_pConnection->m_remoteaddr.sin_addr
                                        , sizeof (g_pPong->m_pConnection->m_remoteaddr.sin_addr)
                                        , g_pPong->m_pConnection->m_remoteaddr.sin_family);
if(remoteHost == NULL)
{
        break;
}

strcpy(m_cNames[i],remoteHost->h_name);
strcpy(m_cNames[i + 1],inet_ntoa(g_pPong->m_pConnection->m_remoteaddr.sin_addr));


Nun habe ich das Programm auf zwei Rechnern gestartet, ich nenne sie mal PC-X und PC-Y
,wenn PC-X der Server ist, erhalte ich folgende Ausgabe:

als Hostname: PC-Y
als IP-Adresse: xxx.xxx.x.10 (ich will nicht die originale IP angeben, daher die x)

und wenn PC-Y der Server ist, erhalte ich folgende Ausgabe:

als Hostname: PC-Y
als IP-Adresse: xxx.xxx.x.11 (die x sind die gleichen Zahlen wie vorher)

Jetzt frag ich mich umso mehr, woran das liegen kann, da ich bei gethostbyaddr m_remotaddr verwende und bei inet_ntoa ebenfalls,
aber trotz unterschiedlicher Adressen der gleiche Hostname ausgegeben wird.

Ich weiß nicht ob es stimmt, aber eine Idee von mir wäre, dass bei der Stelle "(const char *) &g_pPong->m_pConnection->m_remoteaddr.sin_addr"
die hinterste Ziffer durch das Umwandlen zu const char* abgeschnitten wird und dann per Zufall ein Hostname von unserem Router ausgegeben wird.
Aber ich weiß nicht, wie ich das prüfen könnte, da ich ja gezwungen bin ein const char* zu übergeben.

Ich hoffe ihr könnt mir weiterhelfen

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

8

09.09.2012, 12:27

Warum bist du der Meinung, dass durch den cast was abgeschnitten werden sollte? Oder andersrum gesagt: Was meinst du, warum du explizit auch die Größe der Datenstruktur an die Funktion als Parameter übergeben musst?
In der MSDN wird explizit erwähnt dass diese Methode wohl nicht sonderlich zuverlässig ist. Benötigst du denn die Hostnamen so dringend bzw. was hast du mit denen vor? Viele Programme lösen/umgehen dein Problem, indem sie eigene Identifikationen (z.b. Nicknames) verwenden.
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

9

09.09.2012, 12:49

Vielleicht solltest du mal eine andere Funktion versuchen z.B. Diese
greate minds discuss ideas;
average minds discuss events;
small minds discuss people.

Werbeanzeige

Ähnliche Themen