IP חיצוני של משתמש בvisual c++ ?

GPhoenixX

New member
IP חיצוני של משתמש בvisual c++ ?

בניתי משחק רשת ל2 שחקנים בvc++6 עם winsock ... אני רוצה לשכלל את המשחק, ולהוסיף שרת שיטפל בכל השחקנים ובעזרתו השחקנים יוכלו לארגן משחקים עם שחקנים אחרים ללא צורך לדעת את האייפי החיצוני שלהם, כי זה יהיה שמור אצל אותה תוכנת שרת. הבעיה שלי היא שאין לי מושג איך להשיג את האייפי החיצוני של המשתמש, הדרך היחידה שחשבתי עליה היא לקרוא את המידע הזה מעמוד אינטרנט שמציג את האייפי החיצוני בקלות ^^ אז איך ?
 

Jaguar7

New member
אני די בטוח שאתה יכול למצוא

את הכתובת IP של הclient ברגע שהוא מתחבר לserver. אתה עובד עם CSocket או Win32 API ?
 

vbgames

New member
מה זאת אומרת?

אם קליינט התחבר אליך אתה לא יכול לדעת מה הכתובת שלו? נניח שלא: הקליינט עצמו יכול לדעת מה האייפי שלו LoacalIP ואז הוא יכול לשלוח את הכתובת שלו לשרת. הבעיה היא אולי שהקליינט לא ידע מה הIP של השרת. אז אולי צריך לשמור את הכתובת במקום קבוע ברשת.
 

GPhoenixX

New member
לא הבנתם אותי

אני רוצה לדעת את הכתובת של המשתמש ישירות כשהוא נכנס לתוכנית. נניח שאני רוצה לכתוב תוכנית שברגע שהמשתמש נכנס אליה, מופיע לו חלון ובו כתובה כתובת האייפי החיצוני שלו, בדיוק כמו מה שעושה האתר www.whatismyip.com יש דרך פשוטה ?
 

DarkSwell

New member
יש לך אותו כבר..

אם אתה יוצר אובייקט WinSock אז באובייקט זה מוגדרת כתובת ה IP של אותו מחשב בו נוצר האובייקט, במידה ויש חיבור לרשת. נדמה לי שזה המאפיין host.
 

GPhoenixX

New member
אבל זה ip פנימי ...

אני רוצה את האייפי החיצוני ... נגיד שהתחבר משתמש לשרת שלי, חייבת להיות דרך פשוטה לגלות בצד השרת את האייפי של המשתמש שהתחבר ...
 

Jaguar7

New member
ברור שיש דרך

אם מה אתה עובד MFC או Win32API או wxWindows (וכו') ?
 

Jaguar7

New member
חיפוש קצר ב MSDN

מצא שהפרמטר השני של accept הוא מצביע ל sockaddr שמקבל את הכתובת של מי שמנסה להתחבר ואת הפונקציה inet_ntoa שממירה כתובת למחרוזת.
 

GPhoenixX

New member
תודה, אבל ...

ניסיתי את זה :
sockaddr_in tmp; unsigned int clientSocket = accept(mySocket, (sockaddr*)&tmp, 0); printf(inet_ntoa(tmp.sin_addr));​
ואני תמיד מקבל 204.204.204.204 בכתובת אייפי ... מה הבעיה ?
 

GPhoenixX

New member
מצאתי את הטעות D:

הייתי צריך להוסיף את הגודל :
int ret = sizeof(struct sockaddr); unsigned int clientSocket = accept(mySocket,(sockaddr*)&tmp, &ret);​
תודה רבה על ההכוונה :)
 
למעלה