我正在写一个UDP客户端,我需要在我要发送的数据中提到我的UDP数据包的源端口.
>我的程序如何获取kernal生成的随机端口号,udp客户端使用该端口号将数据发送到voip服务器.
所以
>如何在发送数据之前指定特定的UDP源端口.
我会非常感激的.请尽快回复我.我的项目此时已停止.
解决方法
使用bind将您的套接字绑定到端口0,这将允许您使用getsockname来获取端口.如果您愿意,还可以将套接字绑定到特定端口.
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);
原文地址:https://www.jb51.cc/c/110490.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。