編寫UDP通訊的程序時發現:
ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,const struct sockaddr *dest_addr, socklen_t addrlen);
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,struct sockaddr *src_addr, socklen_t *addrlen);
兩個相關的函數,一收一發,為毛線最後一個參數同為sockaddr的socklen_t類型,一個要傳遞變量,一個要傳遞變量指針進去?為何不統一呢?其中有何玄機?
對於這個問題,我們先要弄清楚何時傳遞變量值,何時傳遞變量的指針?
因為傳遞變量值時,作為實參傳遞到函數裡,無論函數如何改變形參的值,實參的值是不變的;如果傳遞的是指針,函數內對形參的操作即對實參的操作。
對於sendto函數,因為是發送數據給dest_addr,所以我們要告訴sendto函數,這個地址結構體的長度,他才能計算地址,發送出去。
而對於recvfrom函數,因為是要接收src_addr的數據,所以當接收完畢以後,這個函數需要告訴我們所接收的數據的對方地址信息src_addr和地址長度信息addrlen,那肯定是要改變addrlen的值了,所以要用指針,把結構體長度存到addrlen指針所指向的內存裡。然後返回。