我正在写一个UDP客户端,我需要在我的数据中提及我的UDP数据包的源端口来发送。C中的UDP客户端源端口?
- 我的程序如何获取由udp客户端用来发送数据到voip服务器的kernal生成的随机端口号。 so
- 如何在发送数据前指定特定的UDP源端口。
我会非常非常感激。请尽快回复我。我的项目在此时停止。
我正在写一个UDP客户端,我需要在我的数据中提及我的UDP数据包的源端口来发送。C中的UDP客户端源端口?
我会非常非常感激。请尽快回复我。我的项目在此时停止。
您应该将bind(2)
的插口输入您选择的其他端口。另见 man 7 ip
和man 7 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套接字只接受来自“连接”对等体的数据报),然后使用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);
我无法解决问题,你可以打一些代码段。 – shan
Didnt工作...你吉美一些代码。 – shan
首先显示非工作代码,并解释它不工作的方式(错误代码,意外行为...)。 –