繁体   English   中英

C 中的 UDP 客户端源端口?

[英]UDP Client Source port in C?

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

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

我将非常感谢。 请尽快回复我。 我的项目此时已停止。

使用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 套接字仅接受来自“已连接”的数据报" peer),然后使用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);

您应该将您的套接字bind(2)到您选择的端口。 另请参见man 7 ipman 7 udp

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM