web-dev-qa-db-ja.com

Cの靴下構造からIPアドレスを取得する方法は?

単純なサーバー/クライアントを作成し、クライアントIPアドレスを取得し、サーバー側に保存して、どのクライアントがクリティカルセクションに入るかを決定しようとしています。私はそれを数回グーグルで検索しましたが、靴下構造からIPアドレスを取得する適切な方法を見つけることができませんでした。

これは、サーバーがクライアントからの要求を受け入れた後にsock structからIPを取得する方法だと思います。より具体的には、サーバー実行後のc

csock = accept(ssock, (struct sockaddr *)&client_addr, &clen) 

ありがとう

34
REALFREE

IPV4を使用していると仮定して、次を実行します。

struct sockaddr_in* pV4Addr = (struct sockaddr_in*)&client_addr;
struct in_addr ipAddr = pV4Addr->sin_addr;

IPアドレスを文字列として使用する場合は、次を実行します。

char str[INET_ADDRSTRLEN];
inet_ntop( AF_INET, &ipAddr, str, INET_ADDRSTRLEN );

IPV6も非常に簡単です...

struct sockaddr_in6* pV6Addr = (struct sockaddr_in6*)&client_addr;
struct in6_addr ipAddr       = pV6Addr->sin6_addr;

文字列を取得することはIPV4とほぼ同じです。

char str[INET6_ADDRSTRLEN];
inet_ntop( AF_INET6, &ipAddr, str, INET6_ADDRSTRLEN );
47
Goz

IPアドレスとポート番号を抽出する簡単で正しい方法は次のとおりです。

printf("IP address is: %s\n", inet_ntoa(client_addr.sin_addr));
printf("port is: %d\n", (int) ntohs(client_addr.sin_port));

SoapBoxの受け入れられた答えは、すべてのアーキテクチャで正しいとは限りません。 ビッグエンディアンとリトルエンディアン を参照してください。

35
Misha

client_addrstruct sockaddr_in(通常は)であると仮定します。 client_addr.sin_addr.s_addrからIPアドレス(32ビット符号なし整数)を取得できます。

この方法で文字列に変換できます:

printf("%d.%d.%d.%d\n",
  int(client.sin_addr.s_addr&0xFF),
  int((client.sin_addr.s_addr&0xFF00)>>8),
  int((client.sin_addr.s_addr&0xFF0000)>>16),
  int((client.sin_addr.s_addr&0xFF000000)>>24));
25
SoapBox