c - C中的UDP客户端源端口?

标签 c

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

  1. 我的程序如何获得由内核生成的随机端口号,udp 客户端使用该端口号向 voip 服务器发送数据。 所以
  2. 如何在发送数据前指定特定的 UDP 源端口。

我会非常非常感谢。请尽快回复我。我的项目在这一点上停止了。

最佳答案

使用 bind 将您的套接字绑定(bind)到端口 0,这将允许您使用 getsockname 获取端口。如果愿意,您还可以将套接字绑定(bind)到特定端口。

例如(假设 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 之前绑定(bind)您的套接字。

例如:

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);

关于c - C中的UDP客户端源端口?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6666095/

相关文章:

objective-c - 我可以在 iOS 上进行这种代码矢量化吗?有哪些替代方案?

C 错误 SQL 指针

c - 如何实现 NxM CUDA 矩阵乘法?

c - 我试图用定界符拆分字符串,但它不起作用,为什么?

C11 _Generic 用法

c - MAP 文件不包含内联函数

c - gcc 中 -g 选项的作用是什么

c - 跨平台检测临时ipv6地址

c - 一个简单的 C 程序的奇怪输出

c++ - 在启用自动(基于扩展)选项的情况下,IAR 无法正确编译 C++ 文件