PDA

View Full Version : پیدا کردن کاربر از طریق اینترنت در صورت اتصال



saffari2005
سه شنبه 22 آذر 1384, 14:13 عصر
سلام

می خوام در یک پروژه ی دسکتاپ ( vc++6 ) اولا از اتصال یا عدم اتصال کاربر به اینترنت آگاه بشم و ثانیا در صورت اتصال آی پی و اطلاعاتی از قبیل نام کشور یا شهرش رو به دست بیارم.البته فکر می کنم با چک کردن آی پی به تنهایی هم میشه از اتصال مطلع شد.
لطفا راهنمایی کنید.

seyedof
سه شنبه 22 آذر 1384, 17:32 عصر
سلام
نکنه میخواهید مسنجر بنویسید؟

تابعش API اینه :



BOOL InetIsOffline (
DWORD dwFlags
);


البته ممکنه یه مشکلاتی داشته باشه. در این صورت آدرس آی پی را هم چک کنید که معتبر هست یا نه.
اطلاعات شهر و کشورش هم نیاز به دسترسی به دیتابیس اوونها داره چون قاعده خاصی نداره. یه سری محصول غیر رایگان است که از روی آی پی محل جغرافیایی رو میده. توی یکی از انجمنها بحث شده بود و سایتش رو نوشته بودند.
در مورد vc6 هم توصیه میکنم ویژوال استودیو جدید رو نصب کنید. خودش پروژه های ۶ رو بدون اینکه خراب کنه به پروژه های vc7 تبدیل میکنه. محیط راحتتری داره و سرعت کامپایل و سرعت کد خروجیش بسیار بالاتر از vc6 است.
ممنون علی

aakh1361
چهارشنبه 23 آذر 1384, 02:25 صبح
نکنه میخواهید مسنجر بنویسید؟

شاید می خواد هکر بشه !! http://asefsoft.com/qsimages/53.gif
موفق باشی

saffari2005
چهارشنبه 23 آذر 1384, 08:56 صبح
از راهنماییتون ممنونم.
امیدوارم مسنجر نوشتن جرم نشده باشه ! ;) البته این سوالات رو برای اون منظور نمی خوام.
و اما دو مطلب یکی روش پیدا کردن آی پی و دیگری آدرس تاپیکی که در موردش فرمودین رو لطفا بنویسید.

saffari2005
چهارشنبه 23 آذر 1384, 13:49 عصر
در مورد برنامه هایی که موقعیت جغرافیایی رو نشون میدن من دو تا شون رو چک کردم ( مثل WhereisIP)که درست جواب ندادند.اگه برنامه ی تست شده ی قابل اعتمادی می شناسین معرفی کنید.

seyedof
پنج شنبه 24 آذر 1384, 20:20 عصر
سلام

برای گرفتن آدرس آی پی کامپیوتر خودتون این تابع رو صدا بزنید :



struct hostent FAR *gethostbyname (
const char FAR *name
);


اسم کامپیوتر رو میگیره و یک ساختار برمیگردونه که توش آدرس آی پی هم هست. باید آی پی کامپیوتر رو چک کنید که آیا معتبر هست یا نه. چون کامپیوترهایی که به اینترنت متصل هستند باید یک آدرس آی پی معتبر داشته باشند. به عنوان مثال 192.168.0.1 یک آدرس معتبر روی اینترنت نیست و معمولا در LAN استفاده میشه.
اسم کامپیوتر رو هم میشه با gethostname بدست آورد.
در مورد اوون دیتابیسها من باهاشون کار نکردم.
ممنون علی

saffari2005
پنج شنبه 24 آذر 1384, 21:49 عصر
منظورم آی پی (valid) کاربر بود نه آی پی خودم.

aakh1361
جمعه 25 آذر 1384, 01:06 صبح
منظورم آی پی (valid) کاربر بود نه آی پی خودم.

شما برنامه ای بنویسید که ای پی و مشخصات سیستم رو بگیره بعد برنامه رو سیستم مورد نظر اجرا کنید و سپس برنامه تون مشخصات سیستم رو براتون بفرسته
همین !

seyedof
جمعه 25 آذر 1384, 11:09 صبح
سلام
نمیدونستم کاربر یعنی خودمون نیستیم !!!
اگر IP طرف static است توسط ping میشه فهمید که کامپیوتر طرف up است یا نه ولی اگر دینامیکه شما باید یه برنامه ای سروری چیزی رو روی کامپیوتر مقصد داشته باشید که در حال اجرا باشه و توسط یه مکانیزم negotiation اینو بفهمید.
ممنون علی

saffari2005
دوشنبه 28 آذر 1384, 11:26 صبح
برای گرفتن آدرس آی پی کامپیوتر خودتون این تابع رو صدا بزنید : gethostbyname(--)

من این تابع رو به شکلی که گفته شده بود استفاده کردم اما اشاره گر خروجی مقدار صفر می گیرد و اطلاعاتی توش نمیشه پیدا کرد.فکر می کنید اشتباهم کجاست؟


char *server_name= "localhost";
struct hostent *pocHost;
pocHost = gethostbyname( server_name );
و یا
unsigned int addr;
addr = inet_addr(server_name);
pocHost = gethostbyaddr((char *)&addr,4,AF_INET);

seyedof
دوشنبه 28 آذر 1384, 14:25 عصر
سلام
فکر نکنم اسم کامپیوتر باید localhost باشه. اول با gethostname اسم کامپیوترتون رو بدست بیارین بعد این اسم رو به تابع gethostbyname بفرستید.
ممنون علی

saffari2005
دوشنبه 28 آذر 1384, 14:44 عصر
سلام
شما قبلا با این توابع کار نکردین؟این یکی هم جواب معتبر نمیده.یعنی اسم کامپیوتر رو نمیده بلکه مقادیر نا معتبر میده.
gethostname(-,-)

seyedof
سه شنبه 29 آذر 1384, 19:21 عصر
سلام
نه تنها قبلا کار کردم که الان هم دارم کار میکنم و درسته. مطمئنا اشکال از جای دیگه است. کدتون رو بفرستید اینجا تا ببینم اشکالش چیه.
اول برنامه شبکه ایتون باید تابع WSAStartup را صدا بزنید تا winsock intialize بشه.
ممنون علی

saffari2005
چهارشنبه 07 دی 1384, 16:23 عصر
سلام
من دیگه اون روش رو تست نکردم ولی از راهنماییهاتون ممنونم.
من نهایتا از این روش استفاده کردم و جواب گرفتم:



void GetIPDlg::FindLocalAddress()
{
CString sAddr;
char data[ sizeof( MIB_IPADDRTABLE ) + 32 * sizeof( MIB_IPADDRROW ) ];
ULONG len = sizeof( data );
struct in_addr inAddr;
PMIB_IPADDRTABLE ipAddr;
char szBuf[ 256 ];
int ind;

// The GetIpAddrTable function retrieves the interface-to-IP-address mapping table.
// This is the structure of the data it returns:
//
// typedef struct _MIB_IPADDRROW
// {
// DWORD dwAddr;
// DWORD dwIndex;
// DWORD dwMask;
// DWORD dwBCastAddr;
// DWORD dwReasmSize;
// unsigned short unused1;
// unsigned short wType;
// } MIB_IPADDRROW, *PMIB_IPADDRROW;
//
// typedef struct _MIB_IPADDRTABLE
// {
// DWORD dwNumEntries;
// MIB_IPADDRROW table[ANY_SIZE];
// } MIB_IPADDRTABLE, *PMIB_IPADDRTABLE;
//

if( GetIpAddrTable( ( PMIB_IPADDRTABLE )data, &len, true ) == NO_ERROR )
{
ipAddr = ( PMIB_IPADDRTABLE )data;
for(ind = 0; ind < ( int )ipAddr -> dwNumEntries; ind++ )
{
if( ipAddr -> table[ ind ].dwAddr != 0 )
{
memmove( &inAddr, &( ipAddr -> table[ ind ].dwAddr ), 4 );
sAddr = inet_ntoa ( inAddr );
sprintf( szBuf, "Local address: \t%s\r\n", sAddr );
szTotResult += szBuf;
}
}
}
}