9.9 getpeername()

リモート側の接続に関するアドレス情報を返す。

9.9.1 書式

#include <sys/socket.h> int getpeername(int s, struct sockaddr *addr, socklen_t *len);

9.9.2 解説

リモート接続を accept() したり、サーバに connect() したら、今度はピアとして知られるものを手に入れます。ピアとは、単に接続先のコンピュータのことで、IP アドレスとポートで識別されます。つまり...

getpeername() は単に、接続中のマシンに関する情報が詰まった struct sockaddr_in を返します。

なぜ "名前" なのか?このガイドで使っているようなインターネットソケットだけでなく、さまざまな種類のソケットがあるので、"名前"はすべてのケースをカバーする良い総称だったのです。この場合、相手の"名前"は相手の IP アドレスとポートです。

この関数は結果のアドレスのサイズを len で返しますが、len には addr のサイズをあらかじめ代入しておく必要があります。

9.9.3 返り値

成功した場合は 0 を、エラーの場合は -1 を返します(それに応じて errno が設定されます。)

9.9.4 例

// assume s is a connected socket socklen_t len; struct sockaddr_storage addr; char ipstr[INET6_ADDRSTRLEN]; int port; len = sizeof addr; getpeername(s, (struct sockaddr*)&addr, &len); // deal with both IPv4 and IPv6: if (addr.ss_family == AF_INET) { struct sockaddr_in *s = (struct sockaddr_in *)&addr; port = ntohs(s->sin_port); inet_ntop(AF_INET, &s->sin_addr, ipstr, sizeof ipstr); } else { // AF_INET6 struct sockaddr_in6 *s = (struct sockaddr_in6 *)&addr; port = ntohs(s->sin6_port); inet_ntop(AF_INET6, &s->sin6_addr, ipstr, sizeof ipstr); } printf("Peer IP address: %s\n", ipstr); printf("Peer port : %d\n", port);

9.9.5 参照

gethostname(), gethostbyname(), gethostbyaddr()