3 Stimmen

Wie erhält man beim Senden eines UDP-Pakets den vom System zugewiesenen ausgehenden Port zurück? (BSD C-Sockets)

Wie erhalten Sie beim Senden eines UDP-Pakets den vom System zugewiesenen ausgehenden Port zurück? Nachdem ich das unten stehende Paket gesendet habe, muss ich mich sofort an den zufälligen Port, den er für mich ausgewählt hat, binden und diesen abhören, um Antworten auf meinen Broadcast zu erhalten.

// 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);

6voto

caf Punkte 224189

Sie brauchen den Hafen nicht zu finden - rufen Sie einfach an recv() o recvfrom() auf dem Socket, den Sie zum Senden verwendet haben, und es wird denselben lokalen Port verwenden (der Port wird gebunden, wenn Sie die sendto() ).

Sie können auch anrufen getsockname() auf dem sendenden Socket, um die Portnummer zu Informationszwecken zu finden, aber Sie sollten immer noch den sendenden Socket zum Empfangen verwenden - wenn Sie das nicht tun, gibt es eine Wettlaufsituation zwischen dem Binden des Sockets und der Antwort, die vom Netzwerk zurückkommt, was dazu führen kann, dass Sie Antworten verlieren.

1voto

sarnold Punkte 99402

Ich glaube, Sie suchen nach dem getsockname(2) anrufen:

   int getsockname(int sockfd, struct sockaddr *addr, socklen_t *addrlen);

DESCRIPTION
   getsockname() returns the current address to which the socket
   sockfd is bound, in the buffer pointed to by addr.  The addrlen
   argument should be initialized to indicate the amount of space
   (in bytes) pointed to by addr.  On return it contains the actual
   size of the socket address.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X