2011-09-07 4 views
7

私はsockaddr_storageに、リモートホストのipv4アドレスとポートを含んでいます。私はこれらの前にstructを見たことがありません。私はそれをstructにキャストする方法がわかりません。ここでIPアドレスとポート番号を直接取得できます。私はstructをグーグルで試しましたが、何も見つかりませんでした。これを行う方法に関する提案はありますか?sockaddr_storageからipとポートを取得する

おかげ

+0

'sockaddr_storage'構造体で、' sockaddr'構造体ではありませんか? –

+0

ええ、それはsockaddr_storage構造体です。 – KaiserJohaan

+1

@Tony: 'sockaddr_storage'は、IPv4とIPv6を含む複数のアドレスファミリをサポートしているので、より新しいコードで使用するのに適した構造体です。 –

答えて

5

あなたはstruct sockaddr_in *またはstruct sockaddr_in6 *へのポインタをキャストし、直接メンバーにアクセスするが、それはエイリアシング違反とmiscompilation問題に関するワームの缶を開けるために起こっていることができます。

NI_NUMERICHOSTとフラグを指定してgetnameinfoへのポインタを渡すと、アドレスとポートの文字列表現が得られます。これは、追加のコードなしでIPv4とIPv6の両方をサポートし、理論上すべての将来のアドレスタイプもサポートするという利点があります。ポインタをvoid *(またはC++を使用している場合はstruct sockaddr *)にキャストしてgetnameinfoに渡す必要があるかもしれませんが、問題はありません。

struct sockaddr_storage client_addr; 
socklen_t client_len = sizeof(struct sockaddr_storage); 

// Accept client request 
int client_socket = accept(server_socket, (struct sockaddr *)&client_addr, &client_len); 

char hoststr[NI_MAXHOST]; 
char portstr[NI_MAXSERV]; 

int rc = getnameinfo((struct sockaddr *)&client_addr, client_len, hoststr, sizeof(hoststr), portstr, sizeof(portstr), NI_NUMERICHOST | NI_NUMERICSERV); 
if (rc == 0) printf("New connection from %s %s", hoststr, portstr); 

結果hoststrstruct sockaddr_storageportstrからIPアドレスは、それぞれのポートが含まれて含まれていることである:上記の答えを拡張しgetnameinfo機能を使用するコードを提供し、このスニペットを確認する

+0

私はC標準ライブラリのみを使用しています。文字列からポートを抽出するのは苦しいと聞こえる。それがIpv4かIpv6かどうかを前もって知っていれば、それをsockaddr_in/sockaddr_in6構造体にキャストしても問題はありませんか? – KaiserJohaan

+0

「atoi」がいかに難しいのか分かりません... –

2

関連する問題