マシンの現在のIPアドレスを含むアプリケーションからメールを送信したいと思います。
メールコードを用意しましたが、機能します。電子メールの本文にIPアドレスを追加する必要があります(つまり、プログラムでIPアドレスを使用して何もしていません)。
システムコマンドを介してipconfigを実行し、結果のテキストを取得するような、本当に簡単な方法があることを期待していました。
ソケットを開ける必要はありません。
ありがとう、
マシンの現在のIPアドレスを含むアプリケーションからメールを送信したいと思います。
メールコードを用意しましたが、機能します。電子メールの本文にIPアドレスを追加する必要があります(つまり、プログラムでIPアドレスを使用して何もしていません)。
システムコマンドを介してipconfigを実行し、結果のテキストを取得するような、本当に簡単な方法があることを期待していました。
ソケットを開ける必要はありません。
ありがとう、
gethostbyname
(非推奨)またはそれ以降のいずれかを使用してくださいgetaddrinfo
。MSDNリンクには例も含まれています。
編集:まあ、それはあなたがVC ++を使用していてc#....を使用していないことを読んだ場合に役立ちます。
だからあなたは私の応答を無視するか、多分それをガイドとして使うことができます...
ここに行く:
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();
}
}
}
これにより、必要なすべての情報が得られ、必要な情報と不要な情報を解析できます。
このコードは、すべてのアダプターをループし、最初のアダプターが稼働しているかどうかを確認します。
#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
}
「JasonHeine」(名前にタグを付ける方法がわからない)コードを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でwifiと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から始まります。でも私にとっては大丈夫です。新しい変数を追加して、番号付けを再計算できます:)
winsock2.hを調べる必要があるかもしれないと思います
確かにgetaddrinfoはあなたのケースで機能しますが、ipを読むだけではなく、Windows IPHelperapiを使用してipconfigユーティリティが行うことのほとんどを 実行できることをお伝えしたいと思います。