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

发送UDP数据包时,如何取回系统分配的出站端口? (BSD C插座)

发布时间:2020-12-16 09:33:51 所属栏目:百科 来源:网络整理
导读:发送UDP数据包时,如何取回系统分配的出站端口? 在发送下面的数据包之后,我需要立即绑定并监听它为我选择的任何随机端口,以获得对我的广播的任何响应. // Open a socketint sd = socket(PF_INET,SOCK_DGRAM,IPPROTO_UDP);// Enable broadcastint broadcastEn
发送UDP数据包时,如何取回系统分配的出站端口?
在发送下面的数据包之后,我需要立即绑定并监听它为我选择的任何随机端口,以获得对我的广播的任何响应.

// Open a socket
int sd = socket(PF_INET,SOCK_DGRAM,IPPROTO_UDP);

// Enable broadcast
int broadcastEnable=1;
setsockopt(sd,SOL_SOCKET,SO_BROADCAST,&broadcastEnable,sizeof(broadcastEnable));

// Configure the port and ip we want to send to
struct sockaddr_in broadcastAddr; // Make an endpoint
memset(&broadcastAddr,sizeof(broadcastAddr));
broadcastAddr.sin_family = AF_INET;
inet_pton(AF_INET,"239.255.255.250",&broadcastAddr.sin_addr); // Set the broadcast IP address
broadcastAddr.sin_port = htons(1900); // Set port 1900

// Send it
char *request = "M-SEARCH * HTTP/1.1rnHOST:239.255.255.250:1900rnMAN:"ssdp:discover"rnST:ssdp:allrnMX:1rnrn";
sendto(sd,request,strlen(request),(struct sockaddr*)&broadcastAddr,sizeof(broadcastAddr));
close(sd);

解决方法

您不需要找到端口 – 只需在您用来发送的套接字上调用recv()或recvfrom(),它将使用相同的本地端口(当您执行sendto()时端口将被绑定).

您也可以在发送套接字上调用getsockname()来查找端口号以供参考,但是您仍然应该使用发送套接字来接收 – 如果不这样做,则绑定套接字和响应之间存在竞争条件来自可能导致您丢失回复的网络.

(编辑:李大同)

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

    推荐文章
      热点阅读