2011-04-05 21 views
3

發送UDP數據包時,如何取回系統分配的傳出端口? 在發送下面的數據包之後,我需要立即綁定並聽取它爲我選擇的隨機端口,以獲得對我的廣播的任何響應。發送UDP數據包時,如何取回系統分配的傳出端口? (BSD C插座)

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

回答

6

你並不需要找到端口 - 只需要調用recv()recvfrom()您用來發送在插座上,並它將使用相同的本地端口(當您執行sendto()時端口會被綁定)。

您也可以在發送套接字上調用getsockname()來查找端口號以獲取信息,但仍應使用發送套接字來接收 - 如果您不接受,則在套接字和響應之間存在爭用條件從網絡回來可能會導致您失去迴應。

+0

太簡單了!謝謝。 – Chris 2011-04-05 00:53:32

1

我相信你正在尋找的getsockname(2)電話:

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.