# Native Code > برنامه نویسی در Delphi > توسعه نرم افزارهای تحت شبکه >  به دست آوردن IP شبکه محلی

## Felony

سلام ،
من میخوام تو برنامم IP شبکه محلی یه سیستم رو بگیرم ، برای این کار یه کامپوننت IDIPWatch رو فرم گزاشتم و کد زیر رو نوشتم :
Ip:=IDIPWatch1.LocalIP;
حالا این کد کار میکنه و IP شبکه ی محلی رو به من میده ولی کافیه تا با اون سیتستم به اینترنت متصل شم ، بعد از اتصال به اینترنت به جای IP شبکه محلی IP کانکشن اینترنت من رو برمیگردونه .

چه طور باید IP شبکه محلی رو بگیرم به طوری که با این مشکل مواجه نشم ؟

----------


## tdkhakpur

خوب وقتی به شبکه وصل میشوید سیستم محتوای اون را عوض میکند. و اون همان لوکال شماست.

----------


## Felony

> خوب وقتی به شبکه وصل میشوید سیستم محتوای اون را عوض میکند. و اون همان لوکال شماست.


این رو که هر کسی میدونه ، اگر کسی در این مورد چیزی میدونه لطفا راه حل ارائه کنه ...

----------


## Felony

کسی نظری نداره ؟

----------


## khazaie01

مشکل من برعکس اینه ! من میخوام IP اینترنت را در بیارم (ADSL) ولی با اینکه به اینترنت وصل هستم بازم آیپی شبکه داخلی را برمیگردونه !

----------


## Saeed_m_Farid

> سلام ،
> من میخوام تو برنامم IP شبکه محلی یه سیستم رو بگیرم 
> ... ولی کافیه تا با اون سیتستم به اینترنت متصل شم ، بعد از اتصال به اینترنت به جای IP شبکه محلی IP کانکشن اینترنت من رو برمیگردونه .
> 
> چه طور باید IP شبکه محلی رو بگیرم به طوری که با این مشکل مواجه نشم ؟





> مشکل من برعکس اینه ! من میخوام IP اینترنت را در بیارم (ADSL) ولی با اینکه به اینترنت وصل هستم بازم آیپی شبکه داخلی را برمیگردونه !


سلام
شاید سیستم شما دارای IP های متعددی برای کار با توپولوژی های متفاوتی در شبکه ها باشه، قرار نیست که سیستم شما فقط تو شرایط خاص جواب بده (داشتن یک IP، حالا چه با DHCP گرفته باشه، چه استاتیک) علاوه بر این دلیل تعویض IP موقع  اتصال به اینترنت تغییر Gateway شما است که تشخیص  Gateway قبلی و ... زیاد کار مناسبی نیست.

به نظر من شما باید تمام IP ها رو در لحظه ای که لازم دارید بگیرید و برنامه هست که باید تصمیم بگیره کدومش بدرد میخوره و قابلیت کاری که شما میخواهید انجام بدید رو داشته باشه، تابع زیر تمام IP های سیستم رو برمی گردونه (البته توجه کنید که نیاز به هدرفایل Winsock داره) :
function GetAllComputerIPAddress(): TStrings;
type
    TaPInAddr = array[0..10] of PInAddr;
    PaPInAddr = ^TaPInAddr;
var
    i: Integer;
    p: PHostEnt;
    s: Array[0..128] of char;
    pPtr: PaPInAddr;
    wsaData: TWSAData;
begin
    WSAStartup(MAKEWORD(2, 2), wsaData);
    Result := TStringList.Create;
    Winsock.gethostname(@s,128);
    p := gethostbyname(@s);
    pPtr := PaPInAddr(p^.h_addr_list);
    i := 0;
    while pPtr^[i] <> nil do
    begin
        Result.Add(inet_ntoa(pptr^[i]^));
        Inc(i);
    end;
    WSACleanup();
end;
البته اگه بخواهید IP یه host غیر از سیستم خودتون رو بدست بیارید باید از تابع زیر استفاده کنید :
function GetAllIPAddress(host: string): TStrings;
type
    TaPInAddr = array[0..10] of PInAddr;
    PaPInAddr = ^TaPInAddr;
var
    i: Integer;
    p: PHostEnt;
    pPtr: PaPInAddr;
    wsaData: TWSAData;
begin
    WSAStartup(MAKEWORD(2, 2), wsaData);
    Result := TStringList.Create;
    p := gethostbyname(PChar(host));
    if (p <> nil) then begin
        pPtr := PaPInAddr(p^.h_addr_list);
        i := 0;
        while pPtr^[i] <> nil do
        begin
            Result.Add(inet_ntoa(pptr^[i]^));
            Inc(i);
        end;
    end;
    WSACleanup();
end;
موفق باشید.

----------


## khazaie01

روی یکی از سیستم های شبکه محلی (کلاینت... اینترنت را از سرور میگیره) برنامه کلاینت / سرور اجرا شده (سرورش) حالا میخوایم از اینترنت و خارج از شبکه محلی با کلاینت به سرور (نرم افزار سرور) وصل بشیم !
اون سیستم فقط آیپی شبکه داخلی خودش را داره چجوری میشه تو اینترنت به اون دستیابی داشت ؟ اصلا میشه ؟

----------


## khazaie01

نمیشه ... ؟

----------


## babakmomeni

با سلام خدمت دوست عزیز آقا/خانم khazaei01
 این مشکل رو ما هم به نوعی توی محل کارمون داشنیم به این ترتیب که برنامه سرور روی سرور یا یکی از ایستگاههای شبکه محلی کارخونه بود و نیاز بود که از دفتر مرکزی هم کلاینت ها باهاش کانکت باشن. مسئله رو با سرویس دهنده مون مطرح کردیم و راه حلها به این قرار بودش:
1- یا باید با پرداخت هزیته نسبتا گزاف آی پی استاتیک بگیریم. چون بهتر از من قطعا می دونین آی پی اینترنتی که شما دارین از طرف gateway آی اس پی به شما داده شده و آی پی اصلی اینترنتی شما و همه ایستگاههای کاری دیگه در حقیقت یکی هستش. راه تستش هم اینه که از طریق سایت http://www.ip-adress.com ای پی های ایستگاههای مختلف از جمله خود سرور رو ببینین و خواهید دید که همه یکی هستن.
2- راه دوم که کم هزینه تره ولی طبعا محدوده این بودش (ما هم همین قصه رو انتخاب کردیم) سرویس اینترنت رو هم برای دفتر و هم برای کارخونه از یک ای اس پی گرفتیم و تقاضای یک تانل کردیم که باعث میشه یک پل از طریق اینترنت بین شبکه دفتر و کارگاه برقرار بشه و سیستم های دو طرف بتونن همدیگر رو ببینن. جالب کارشون هم اینه که با برقرار شدن تانل ای پی های قابل مشاهده همون ای پی های شبکه محلی هر طرف هستن و به راحتی پینگ میشن.
روش دوم زمانی میتونه کارکرد داشته باشه که محل واقعی کلاینت و سرور معلوم باشه و اون امکانی که من ازش صحبت کردم وجود داشته باشه. وگرنه که باید از روش اول استفاده بفرمایین. 
حالا اگه هر کدوم رو پیاده کردین دیگه فرقی نداره برنامه هاتون چی باشه و با چه زبانی بخواین بنویسین یا بهتره این جوری بگم که من راه حل برنامه نویسی واسه این قضیه ندارم چون فکر کنم این مشکل از برنامه نویسی حاصل نمیشه که راهش هم اون باشه.
آخر سر می خوام از دوستان عزیز خواهش کنم اگه راه دیگه ای هم هستش بگن تا من هم تستش کنم چون این دو داستان که عرض کردم صرفا روشهایی بود که من می دونستم و معنیش قطعا این نیست که راه دیگه ای نباشه.

----------


## Felony

دوستان عزیز احتمالا شما قوانین سایت رو تا به حال نخوندین !
هر سوال در تاپیکی جداگانه ...

----------


## khazaie01

> دوستان عزیز احتمالا شما قوانین سایت رو تا به حال نخوندین !
> هر سوال در تاپیکی جداگانه ...


بله درسته... با این سوال موضوع تاپیک را عوض کردم .ببخشید اشتباه از من بود و دوست عزیزمنون فقط جواب سوال من را دادن ....
فکر کنم این موضوع ربطی به برنامه نویسی نداره و بهتره این موضوع را در تالار شبکه مطرح کنم ...
ممنووووووووون

----------


## Ebrahim Asadi

سلام
از كد زير مي توانيد براي به دست آوردن IP محلي استفاده كنيد:
function GetLocalIP: string;
var
  WsaData: TWSAData;
  P: PHostEnt;
  S: array[0..128] of char;
begin
  WSAStartup(MAKEWORD(1,1), WsaData);
  GetHostName(@s, 128);
  P := GetHostByName(@s);
  Result := iNet_ntoa(PInAddr(p^.h_addr_list^)^);
  WSACleanup;
end;
فايل WinSock را بايد به ليست Uses برنامه اضافه كنيد.

----------

