9.9. getpeername()

Return address info about the remote side of the connection


int getpeername(int s, struct sockaddr *addr, socklen_t *len);
Once you have either accept()ed a remote connection, or connect()ed to a server, you now have what is known as a peer. Your peer is simply the computer you're connected to, identified by an IP address and a port. So...

getpeername() simply returns a struct sockaddr_in filled with information about the machine you're connected to.

Why is it called a “name”? Well, there are a lot of different kinds of sockets, not just Internet Sockets like we're using in this guide, and so “name” was a nice generic term that covered all cases. In our case, though, the peer's “name” is it's IP address and port.

Although the function returns the size of the resultant address in len, you must preload len with the size of addr.

Return Value
Returns zero on success, or -1 on error (and errno will be set accordingly.)

// 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);
See Also
gethostname(), gethostbyname(), gethostbyaddr()