2016-10-30 34 views

回答

2

是,有一個重大的區別。

  • 對於第一種情況,你傳遞一個unsigned int的地址,基本上是insigned int *

  • 在第二種情況下,您傳遞sizeof運算符的結果size_t

它們是不一樣的。

也就是說,根據man page,基本上都是不正確的。最後一個參數應該是socklen_t *,所以你應該更好地堅持正確的類型。

+0

你什麼時候說「兩者都不正確」,他們100%不正確?爲什麼第一個不正確?我傳遞一個unsigned int的引用。參數socklen_t *不能是一個unsigned int嗎? –

+1

@jorgesaraiva,'socklen_t'是強烈依賴於體系結構大小的類型之一...因爲它們可以作爲'signed int'(允許負值,錯誤值)實現爲'unsigned int'(以允許較大的值)和'unsigned long int'(例如,在64位體系結構中,一個64位整數)以允許巨大的值。你最好使用適當的類型,因爲它們在那裏是爲了方便。而且更重要的是,如果你必須投入指針來輸入,而不是值。這是一個常見的錯誤,導致許多未被發現的錯誤,很難追查。 –

1

實際上有區別。正如有人所說,傳遞地址(第一種情況)或(size_t)值(第二種情況)之間有很大區別。如果您檢查recvfrom手動引用,您可以看到最後一個參數是指向一個內存空間的指針,該內存空間的大小爲前一個參數的sockaddr大小。因爲你給的lenght_addr的cli_addr的大小,然後通過指針作爲參數

#include <sys/socket.h> 

ssize_t recvfrom(int socket, void *buffer, size_t length, int flags, 
     struct sockaddr *address, socklen_t *address_len); 


/*address_len 
Specifies the length of the sockaddr structure pointed to by the address argument.*/ 

第一個實際上是正確的。所以它應該可以正常工作。

相關問題