最近阅读UNIX网络编程第四章时,书本末尾介绍了两个函数getsockname()和getpeername(),可以用于获取服务器端和客户端的IP地址与端口,原本很简单的两个函数,过一眼即明白函数的用法,但在实际编程测试中,却出现了一个让人意外的结果,如下图所示:
这两个函数在第一个客户连接时解析出的IP地址和端口全部为0,出乎我的期望。而在后面的客户连接时,打印出的IP地址和端口却是正确的。
下面先给出客户端和服务端的代码:
客户端:

#include <netinet/in.h> #include <sys/socket.h> #include <unistd.h> #include <pton32> #include <iostream> int main(int argc, char const *argv[]) { int sockfd; sockaddr_in srvaddr; bzero(&srvaddr, sizeof(srvaddr)); srvaddr.sin_family = AF_INET; if (argc < 2) { std::cout << "usage:" << argv[0] << " <IP address>" << std::endl; return -1; } srvaddr.sin_addr = pton32(argv[1]); srvaddr.sin_port = htons(7777); sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (connect(sockfd, (sockaddr *)&srvaddr, sizeof(srvaddr)) != 0) { std::cout << "connect error,retry please."; throw; } char str[128] = {'