2014-12-23 88 views
2

我不明白我在gcc編譯器中的警告。 警告是:warning: pointer targets in passing argument 6 of ‘recvfrom’ differ in signedness我不知道,哪裏出了問題,我沒有使用signed and unsigned值。簽名的不同 - 警告

問題是行:

recvfrom(server_socket, inputbuffer, maxLenght, 0, (struct sockaddr*) remote_addr, &server_addr_len); 

我嘗試這樣做:

recvfrom(server_socket, inputbuffer, maxLenght, 0, (unsigned int) remote_addr, &server_addr_len); 

但它並沒有幫助我。感謝您的建議和解釋。

+0

哪一個是第6個參數? –

回答

3

man recvfrom()

ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, 
        struct sockaddr *src_addr, socklen_t *addrlen); 

recvfrom()需要一個socklen_t爲第6 parame之三。您可能會通過int

所以定義server_addr_len像這樣:

socklen_t server_addr_len; 
+0

'socklen_t server_addr_len;'是聲明**和**定義。 'extern socklen_t server_addr_len;'只是一個聲明。 'socklen_t server_addr_len = 0;'是聲明**和**定義**和**初始化。 @iharob供您參考:http://stackoverflow.com/questions/1410563/what-is-the-difference-between-a-definition-and-a-claclaration – alk

+0

謝謝先生證明鏈接。有一個問題,是否與存儲類有關?我的意思是說,我可以這樣說:「_in在auto存儲的情況下,'socklen_t server_addr_len;'總是一個有效的定義,但是,對於'extern',這可能並不總是這樣'」,編譯時缺少'-fno-common'? –

+1

「聲明」是一種承諾,「定義」是一個事實。 @SouravGhosh – alk

0

只是聲明server_addr_lensocklen_t

socklen_t server_addr_len; 

因爲recvfrom函數簽名是

ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, 
     struct sockaddr *src_addr, socklen_t *addrlen); 
+0

感謝您的回覆,但'gcc'compiler無法編譯這個。 – staigoun

+0

爲什麼不呢?它現在給出了什麼錯誤? –

+0

'錯誤:轉換爲非標量類型請求' – staigoun

1

recvfrom()man page

它說,該函數原型爲

ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, 
      struct sockaddr *src_addr, socklen_t *addrlen); 

第六說法是socklen_t *addrlen。因此,雖然從你的應用程序中調用recvfrom(),你必須使用它像

socklen_t server_addr_len = 0; 
struct sockaddr * remote_addr = NULL; 
ssize_t retval = 0; 
. 
. 
retval = recvfrom(server_socket, inputbuffer, maxLenght, 0, remote_addr, &server_addr_len); 

圖片的標題說明:

1.定義在某種程度上變量,這樣他們不需要cast ING。良好的做法。 2.檢查返回值recvfrom() [ar爲該情況,任何庫調用]爲成功。

+0

@iharob是啊有區別。但爲什麼你對_declare_說,爲什麼不在這裏使用_define_ term?你能否詳細說明一下?謝謝。 –

+0

只有'usigned int'讓我的編譯器很開心。 – staigoun

+0

@iharob好的,但通常,初始化變量是一種更好的做法。結合起來,它作出了一個定義。 :-) –