我听说操作系统为客户端选择了一个随机的空闲端口。
我试图捕捉操作系统选择的端口号。
然后我做了以下两个示例程序。
示例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。