私はsockaddr_storage
に、リモートホストのipv4アドレスとポートを含んでいます。私はこれらの前にstruct
を見たことがありません。私はそれをstruct
にキャストする方法がわかりません。ここでIPアドレスとポート番号を直接取得できます。私はstruct
をグーグルで試しましたが、何も見つかりませんでした。これを行う方法に関する提案はありますか?sockaddr_storageからipとポートを取得する
おかげ
私はsockaddr_storage
に、リモートホストのipv4アドレスとポートを含んでいます。私はこれらの前にstruct
を見たことがありません。私はそれをstruct
にキャストする方法がわかりません。ここでIPアドレスとポート番号を直接取得できます。私はstruct
をグーグルで試しましたが、何も見つかりませんでした。これを行う方法に関する提案はありますか?sockaddr_storageからipとポートを取得する
おかげ
あなたは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);
結果hoststr
がstruct sockaddr_storage
とportstr
からIPアドレスは、それぞれのポートが含まれて含まれていることである:上記の答えを拡張しgetnameinfo
機能を使用するコードを提供し、このスニペットを確認する
私はC標準ライブラリのみを使用しています。文字列からポートを抽出するのは苦しいと聞こえる。それがIpv4かIpv6かどうかを前もって知っていれば、それをsockaddr_in/sockaddr_in6構造体にキャストしても問題はありませんか? – KaiserJohaan
「atoi」がいかに難しいのか分かりません... –
。
'sockaddr_storage'構造体で、' sockaddr'構造体ではありませんか? –
ええ、それはsockaddr_storage構造体です。 – KaiserJohaan
@Tony: 'sockaddr_storage'は、IPv4とIPv6を含む複数のアドレスファミリをサポートしているので、より新しいコードで使用するのに適した構造体です。 –