我听说操作系统为客户端选择了一个随机的空闲端口。
我试图捕捉操作系统选择的端口号。
然后我做了以下两个示例程序。
示例c显示

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

示例2.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;
}

样本2.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;
}

最佳答案

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

10-08 06:13
查看更多