2011-07-12 192 views
6

我正在寫一個UDP客戶端,我需要在我的數據中提及我的UDP數據包的源端口來發送。C中的UDP客戶端源端口?

  1. 我的程序如何獲取由udp客戶端用來發送數據到voip服務器的kernal生成的隨機端口號。 so
  2. 如何在發送數據前指定特定的UDP源端口。

我會非常非常感激。請儘快回覆我。我的項目在此時停止。

回答

2

您應該將bind(2)的插口輸入您選擇的其他端口。另見 man 7 ipman 7 udp

+0

Didnt工作...你吉美一些代碼。 – shan

+0

首先顯示非工作代碼,並解釋它不工作的方式(錯誤代碼,意外行爲...)。 –

7

使用bind將您的套接字綁定到端口0,這將允許您使用getsockname來獲取端口。如果您願意,您還可以將套接字綁定到特定的端口。

如(假設IPv4套接字,沒有錯誤檢查):

struct sockaddr_in sin = {}; 
socklen_t slen; 
int sock; 
short unsigned int port; 

sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); 
sin.sin_family = AF_INET; 
sin.sin_addr.s_addr = htonl(INADDR_ANY); 
sin.sin_port = 0; 

bind(sock, (struct sockaddr *)&sin, sizeof(sin)); 
/* Now bound, get the address */ 
slen = sizeof(sin); 
getsockname(sock, (struct sockaddr *)&sin, &slen); 
port = ntohs(sin.sin_port); 

另外,如果你是一個單一的服務器進行通信,您可以在UDP套接字使用connect(這也爲您提供了得心應手的副作用允許您使用send而不是sendto,並且使UDP套接字只接受來自「連接」對等體的數據報),然後使用getsockname獲取您的本地端口/地址。在使用connect之前,您仍然可以選擇綁定您的套接字。

如:

struct sockaddr_in sin = {}; 
socklen_t slen; 
int sock; 
short unsigned int port; 

sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); 
/* set sin to your target host... */ 
... 
connect(sock, (struct sockaddr *)&sin, sizeof(sin)); 
/* now retrieve the address as before */ 
slen = sizeof(sin); 
getsockname(sock, (struct sockaddr *)&sin, &slen); 
port = ntohs(sin.sin_port); 
+0

我無法解決問題,你可以打一些代碼段。 – shan