【问题标题】:How can I obtain the local TCP port and IP Address of my client program?如何获取客户端程序的本地 TCP 端口和 IP 地址?
【发布时间】:2011-01-30 13:52:28
【问题描述】:

我正在为一个简单的工作项目做准备,并试图让自己熟悉 Unix 开发环境中的套接字编程基础知识。在这一点上,我有一些基本的服务器端代码和客户端代码设置来进行通信。目前,我的客户端代码成功连接到服务器代码,服务器代码向它发送了一条测试消息,然后都退出了。完美的!这正是我想要完成的。现在我正在使用用于获取有关两个环境(服务器和客户端)信息的函数。我想获取客户端的本地IP地址和动态分配的TCP端口。我发现的功能是getsockname()...

//setup the socket
if ((sockfd = socket(p->ai_family, p->ai_socktype, p->ai_protocol)) == -1) 
{
   perror("client: socket");
   continue;
}

//Retrieve the locally-bound name of the specified socket and store it in the sockaddr structure
sa_len = sizeof(sa);
getsock_check = getsockname(sockfd,(struct sockaddr *)&sa,(socklen_t *)&sa_len) ;
if (getsock_check== -1) {
    perror("getsockname");
    exit(1);
}

printf("Local IP address is: %s\n", inet_ntoa(sa.sin_addr));
printf("Local port is: %d\n", (int) ntohs(sa.sin_port));

但输出始终为零...

Local IP address is: 0.0.0.0
Local port is: 0

有没有人看到我可能做错或肯定做错了什么?

非常感谢您的所有帮助!

【问题讨论】:

标签: c unix sockets


【解决方案1】:

从您的代码外观来看,您没有在套接字上执行connectaccept。在您完成此操作之前,您从 getsockname 获得的数据是未定义的。

【讨论】:

    【解决方案2】:

    在调用 connect() 之前,我认为在这种情况下你不能有意义地调用 getsockname - 内核不会将它绑定到特定端口,直到它需要(或被明确告知这样做),本地地址是根据路由表选择的,因此也是目的地。

    【讨论】:

      猜你喜欢
      • 2014-12-29
      • 2011-01-08
      • 1970-01-01
      • 1970-01-01
      • 2012-03-14
      • 2012-02-16
      • 2015-07-27
      • 2019-01-14
      • 2015-12-20
      相关资源
      最近更新 更多