API
1. getpeername()
#include <sys/socket.h>
int getpeername(int sockfd, struct sockaddr *restrict addr,
socklen_t *restrict addrlen);
// On success, returns 0. On error, -1 is returned and errno is set.
返回连接到sockfd对端的地址,存入addr。
其中参数addrlen应该被初始化为addr所指空间的长度。(不正确初始化会失败)
返回时,会在addrlen中存入实际返回的字节数。
如果addr缓冲区太小,IP名会被截断。
2. getsockname()
#include <sys/socket.h>
int getsockname(int sockfd, struct sockaddr *restrict addr,
socklen_t *restrict addrlen);
//Returns 0 on success and returns -1 on error.
返回sockfd当前所绑定的地址,存入addr所指缓冲区。
addrlen表示addr缓冲区的长度。
返回时,addrlen用于返回实际上的addr的大小。
如果addr缓冲区太小,地址会被截断,这种情况下,addrlen会返回一个比初始提供的更大的值。
例子
static string
get_remote_ip_by_fd (int sockfd) noexcept (false)
{
struct sockaddr_storage addr;
socklen_t addrlen = sizeof (addr);
if (getpeername (sockfd, (sockaddr *) &addr, &addrlen) == -1)
throw _SocketException (getpeername);
sockaddr_in *tcp_addr = (sockaddr_in *) &addr;
char ip[INET_ADDRSTRLEN];
if (inet_ntop (AF_INET, &tcp_addr->sin_addr, ip, sizeof (ip)) == NULL)
throw _SocketException (inet_ntop);
return string (ip);
}

1040

被折叠的 条评论
为什么被折叠?



