【问题标题】:How to get client port number that the opereating system chooses?如何获取操作系统选择的客户端端口号?
【发布时间】:2013-12-16 02:59:11
【问题描述】:

我听说操作系统会为客户端随机选择一个空闲端口。

我已经尝试获取操作系统选择的端口号。

然后我做了以下两个示例程序。

sample.c 展示

sin_port is 49210
sin_port is 49210
sin_port(getMyPortNum) is 0

sample2.c 展示

sin_port is 0
sin_port is 0
sin_port(getMyPortNum) is 34936

操作系统选择的正确客户端端口号是什么?

我认为 sample2.c 的最后一个数字是正确的,因为 sample.c 的 49210 不是随机的,总是相同的数字。

为什么两个程序的行为不同?

或者这些在 sample.c 中的代码在源代码中不需要的代码是如何工作的?

  struct sockaddr_in addr2;
  socklen_t addr2_sz = sizeof(addr2);
  int i;
  int j;

示例.c

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <string.h>
#include <netinet/in.h>
main()
{
 int sock;
 struct sockaddr_in addr;
 int sockaddr_in_size = sizeof(struct sockaddr_in);
 struct sockaddr_in addr2;
 socklen_t addr2_sz = sizeof(addr2);
 int i;
 int j;
 printf("sin_port is %d\n",ntohs(addr.sin_port));
 sock = socket(AF_INET, SOCK_DGRAM, 0);
 bind(sock,(struct sockaddr *)&addr,sizeof(addr));
 printf("sin_port is %d\n",ntohs(addr.sin_port));
 printf("sin_port(getMyPortNum) is %d\n",ntohs(getMyPortNum(sock)));

}
int getMyPortNum(int sock)
{
        struct sockaddr_in s;
        socklen_t sz = sizeof(s);
        getsockname(sock, (struct sockaddr *)&s, &sz);
        return s.sin_port;
}

Sample2.c

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <string.h>
#include <netinet/in.h>
main()
{
 int sock;
 struct sockaddr_in addr;
 int sockaddr_in_size = sizeof(struct sockaddr_in);
// struct sockaddr_in addr2;
// socklen_t addr2_sz = sizeof(addr2);
// int i;
// int j;
 printf("sin_port is %d\n",ntohs(addr.sin_port));
 sock = socket(AF_INET, SOCK_DGRAM, 0);
 bind(sock,(struct sockaddr *)&addr,sizeof(addr));

 printf("sin_port is %d\n",ntohs(addr.sin_port));
 printf("sin_port(getMyPortNum) is %d\n",ntohs(getMyPortNum(sock)));
}
int getMyPortNum(int sock)
{
        struct sockaddr_in s;
        socklen_t sz = sizeof(s);
        getsockname(sock, (struct sockaddr *)&s, &sz);
        return s.sin_port;
}

【问题讨论】:

  • 您永远不会初始化 addr 或将其传递给任何东西 - 您打印出来的是随机垃圾。
  • 未定义的行为是未定义的。你还没有初始化结构。澄清一下,这不是“默认”任何东西,它是垃圾。
  • 我想知道如何使用操作系统选择的端口为客户端初始化 addr。我想看看会选择哪个端口。

标签: c sockets port


【解决方案1】:

这两个程序都没有任何意义。两者都没有与端口相关的任何内容,但都尝试打印出端口。

【讨论】:

    【解决方案2】:

    您应该 bind() 创建的套接字,将已初始化的 sockaddr_in 结构的指针作为参数提供给绑定。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-05
      • 2013-05-01
      • 2019-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-22
      • 2013-10-11
      相关资源
      最近更新 更多