加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

C中的UDP客户端源端口?

发布时间:2020-12-16 03:42:49 所属栏目:百科 来源:网络整理
导读:我正在写一个UDP客户端,我需要在我要发送的数据中提到我的UDP数据包的源端口. 我的程序如何获取kernal生成的随机端口号,udp客户端使用该端口号将数据发送到voip服务器. 所以 如何在发送数据之前指定特定的UDP源端口. 我会非常感激的.请尽快回复我.我的项目此
我正在写一个UDP客户端,我需要在我要发送的数据中提到我的UDP数据包的源端口.

>我的程序如何获取kernal生成的随机端口号,udp客户端使用该端口号将数据发送到voip服务器.
所以
>如何在发送数据之前指定特定的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,&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,IPPROTO_UDP);
/* set sin to your target host... */
...
connect(sock,sizeof(sin));
/* now retrieve the address as before */
slen = sizeof(sin);
getsockname(sock,&slen);
port = ntohs(sin.sin_port);

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读