【发布时间】: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。我想看看会选择哪个端口。