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

Chr*_*ris 3 c sockets

发送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, 0, 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.1\r\nHOST:239.255.255.250:1900\r\nMAN:\"ssdp:discover\"\r\nST:ssdp:all\r\nMX:1\r\n\r\n";
sendto(sd, request, strlen(request), 0, (struct sockaddr*)&broadcastAddr, sizeof(broadcastAddr));
close(sd);
Run Code Online (Sandbox Code Playgroud)

caf*_*caf 6

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

您也可以拨打getsockname()发送套接字上寻找信息的目的端口号,但你还是应该用发送者的套接字接受-如果你不这样做,有约束力的插座和响应来自网络的背部之间的竞争条件这可能会导致你失去回应.