2011-07-12 159 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