2009-05-12 29 views
0

マシンの現在のIPアドレスを含むアプリケーションから電子メールを送信します。アプリケーション内から現在のIPアドレスを取得する(VC++ 2005)

私はその場所に電子メールコードを持っており、動作します。私は電子メールの本文にipaddressを追加するだけです(つまり、私はIPアドレスを使ってプログラム的に何もしていません)。

私は、システムコマンドでipconfigを実行して結果のテキストを取得するような単純な方法があることを期待していました。

ソケットを開く必要はありません。

おかげで、

答えて

1

このコードはすべてのアダプタをループし、最初のものを確認します。

#include <afxtempl.h> 
#include <afxsock.h> 
#include <iphlpapi.h> 

u_long GetFirstIpAddressUp(SOCKET s) 
{ 
#define MAX_ADAPTERS 30 
#pragma comment(lib, "Iphlpapi.lib") 
    IP_ADAPTER_ADDRESSES AdapterAddresses[MAX_ADAPTERS];   
    PIP_ADAPTER_ADDRESSES pAdapterAddresses = AdapterAddresses;            
    DWORD dwBufLen = sizeof(AdapterAddresses); 
    if (GetAdaptersAddresses(AF_INET, 0, NULL, AdapterAddresses,&dwBufLen) == ERROR_SUCCESS) 
    { 
     do { 
      if ((pAdapterAddresses->OperStatus == IfOperStatusUp)) 
      { 
       sockaddr_in* pAdr = (sockaddr_in*)pAdapterAddresses->FirstUnicastAddress->Address.lpSockaddr; 
       return pAdr->sin_addr.S_un.S_addr; 
      } 
     pAdapterAddresses = pAdapterAddresses->Next; 
     } while(pAdapterAddresses); 
    } 
    return INADDR_ANY; // No adapters are up 
} 
0

私はあなたがwinsock2.hに

1

使用gethostbyname(非推奨)またはgetaddrinfo以降のいずれかを見る必要があるかもしれ信じています。 MSDNリンクにも例があります。

1

EDIT:まあ、それは

...私は.....

をC#]を使用すると、VC++を使用していることを読んでいないのであれば、あなたが私の応答を無視し、または多分ガイドとして使用することができますことができますここ

屋に行く:

using System; 
using System.Net; 


namespace testProgram 
{ 
    class Program 
    { 
     static void Main() 
     { 
      String strHostName = string.Empty; 
      // Getting Ip address of local machine... 
      // First get the host name of local machine. 
      strHostName = Dns.GetHostName(); 
      Console.WriteLine("Local Machine's Host Name: " + strHostName); 


      // Then using host name, get the IP address list.. 
      IPHostEntry ipEntry = Dns.GetHostEntry(strHostName); 
      IPAddress[] addr = ipEntry.AddressList; 

      for (int i = 0; i < addr.Length; i++) 
      { 
       Console.WriteLine("IP Address {0}: {1} ", i, addr[i].ToString()); 
      } 
      Console.ReadLine(); 

     } 
    } 

} 

これはあなたが必要なすべての情報を与えるだろうし、その後いくつかの、あなたが必要なものを解析することができますし、必要はありません。

0

は確かにあなたのケースで作品をのgetaddrinfoが、私はあなたのすべてが以上にしたい場合は、ちょうどあなたがIPCONFIGユーティリティは何のほとんどを行うには窓IP Helper apiを使用することができ、IPを読むことを言及しようと思いました。

1

私は「Jason Heine」(名前にタグを付ける方法を知らない)コードをC++にアップデートしました。今はうまくいくはずです。彼の方法でthnx。 だから、これは私が得るものです:

using namespace System; 
using namespace System::Net; 

void main(){ 
    String ^strHostName = String::Empty; 
    // Getting Ip address of local machine... 
    // First get the host name of local machine. 
    strHostName = Dns::GetHostName(); 
    Console::WriteLine("Local Machine's Host Name: " + strHostName); 

    // Then using host name, get the IP address list.. 
    IPHostEntry^ ipEntry = Dns::GetHostEntry(strHostName); 
    array<IPAddress^> ^addr = ipEntry->AddressList; 

    for (int i = 0; i < addr->Length; i++) 
    { 
     Console::WriteLine("IP Address {0}: {1} ", i, addr[i]->ToString()); 
    } 
    Console::ReadKey(); 
} 

私は、これはあなたを助けることを願っています。

テスト済み私のPC上では、Wi-FiとLANの接続と「VMware Player」用の仮想チャーダーがほとんどなく、4つのIPv6を取得してから4つのIPv4で折り畳まれました。 IPv4だけが必要な場合は、

using namespace System; 
using namespace System::Net; 

void main(){ 
    String ^strHostName = String::Empty; 
    // Getting Ip address of local machine... 
    // First get the host name of local machine. 
    strHostName = Dns::GetHostName(); 
    Console::WriteLine("Local Machine's Host Name: " + strHostName); 

    // Then using host name, get the IP address list.. 
    IPHostEntry^ ipEntry = Dns::GetHostEntry(strHostName); 
    array<IPAddress^> ^addr = ipEntry->AddressList; 

    for (int i = 0; i < addr->Length; i++) 
    { 
     if(addr[i]->ToString()->Length < 20){ 
      Console::WriteLine("IP Address {0}: {1} ", i, addr[i]->ToString()); 
     } 
    } 
    Console::ReadKey(); 
} 

IPv4を取得できます。ちょうど数字は4から始まります。しかし、私にとっては大丈夫です。番号を再計算するために新しい変数を追加することができます:)

関連する問題