C中的UDP客户端源端口?

时间:2011-07-12 14:46:49

标签: c

我正在编写UDP客户端,我需要在我要发送的数据中提到我的UDP数据包的源端口。

  1. 我的程序如何获取kernal生成的随机端口号,udp客户端使用该端口号将数据发送到voip服务器。 所以
  2. 如何在发送数据之前指定特定的UDP源端口。
  3. 我将非常感激。请尽快回复我。我的项目此时已停止。

2 个答案:

答案 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而不是{{1使UDP套接字只接受来自“连接”对等体的数据报,然后使用sendto获取本地端口/地址。在使用getsockname之前,您仍可以选择绑定套接字。

例如:

connect

答案 1 :(得分:2)

你应该bind(2)你的套接字到你选择的端口。也可以看看 man 7 ipman 7 udp