C中的UDP客户端源端口?
我正在编写一个UDP客户端,我需要在要发送的数据中提到UDP数据包的源端口C中的UDP客户端源端口?,c,C,我正在编写一个UDP客户端,我需要在要发送的数据中提到UDP数据包的源端口 我的程序如何获得内核生成的随机端口号,udp客户端使用该端口号向voip服务器发送数据。 所以 如何在发送数据之前指定特定的UDP源端口 我将非常感激。请尽快回复我。我的项目就此停止 您应该将(2)套接字绑定到您选择的端口。另见 man7ip和man7udp使用bind将套接字绑定到端口0,这将允许您使用getsockname获取端口。如果愿意,还可以将套接字绑定到特定端口 例如(假设IPv4套接字,无错误检查): 或者
将(2)
套接字绑定到您选择的端口。另见
man7ip
和man7udp使用bind
将套接字绑定到端口0,这将允许您使用getsockname
获取端口。如果愿意,还可以将套接字绑定到特定端口
例如(假设IPv4套接字,无错误检查):
或者,如果您与单个服务器通信,您可以在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);
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);
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);