我聽說操作系統爲客戶端選擇一個隨機的自由端口。如何獲取操作系統選擇的客戶端口號?
我試圖捕獲操作系統選擇的端口號。
然後我做了以下兩個示例程序。
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;
sample.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'或將它傳遞給任何東西 - 你打印的是隨機垃圾。 – Mat
未定義的行爲未定義。你還沒有初始化結構。澄清,這不是「默認」的任何東西,它是垃圾。 –
我想知道如何爲端口操作系統選擇的客戶端初始化addr。我想看看哪個端口會被選中。 – user1345414