2013-12-16 52 views
0

我聽說操作系統爲客戶端選擇一個隨機的自由端口。如何獲取操作系統選擇的客戶端口號?

我試圖捕獲操作系統選擇的端口號。

然後我做了以下兩個示例程序。

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; 
} 
+4

你永遠不會初始化'addr'或將它傳遞給任何東西 - 你打印的是隨機垃圾。 – Mat

+1

未定義的行爲未定義。你還沒有初始化結構。澄清,這不是「默認」的任何東西,它是垃圾。 –

+0

我想知道如何爲端口操作系統選擇的客戶端初始化addr。我想看看哪個端口會被選中。 – user1345414

回答

1

您應該bind()創建的套接字,給已經初始化的sockaddr_in結構的指針綁定爲參數。

2

無論程序使任何意義。也沒有涉及港口的任何事情,但都試圖打印出一個港口。

相關問題