2017-03-02 71 views
2

所以我通過一個參數,我的主要是一個IP作爲char *名稱ipStr爲什麼我從sendto()中獲得「無效參數」?

然後我初始化的變量調用sendto()之前舉行它的長度:

sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); 
char buffer[8]; 
socklen_t ipLen = sizeof(ipStr); 

      res = sendto(sock, buffer, sizeof(buffer), 0, 
        (struct sockaddr*) &ipStr, ipLen); 

但我仍然得到Invalid argument作爲一個返回的錯誤。

我沒有得到g ++編譯錯誤,所以我不知道問題出在哪裏。

編輯

我發現我ipLen之前沒有刪除sizeof,改變上述但還是收到Invalid argument

+0

套接字是否正確返回?什麼是ipStr設置? – Joe

+0

是'sock'正確返回,我不知道ipStr設置爲什麼意思。 – xeon48

+1

ipstr可能是你的「無效論點」,但我沒有看到它的代碼,只是你聲稱。讓我們看看能夠證明您的問題的完整代碼。 – Joe

回答

3

您的sockaddr可能是錯的,它是一個struct,其中包含地址和其他一些數據的二進制表示。這是一個sockaddr_in轉換爲sockaddr

嘗試:

struct sockaddr_in ip4addr; 

ip4addr.sin_family = AF_INET; 
ip4addr.sin_port = htons(1234); 
addrDest.sin_addr.s_addr = inet_addr("1.2.3.4"); 
0

socklen_t ipLen = sizeof(ipStr)返回ipStr數據類型的大小,而不是字符串的長度它指向。 ipStr的數據類型是char *,因此sizeof(ipStr)產生8(或在32位系統上的4)。所以你的參數可能不會被正確解釋。

改爲使用socklen_t ipLen = strlen(ipStr)

+0

'sendto'不期望任何字符串或字符串長度。 –

+0

@ n.m。 'ipLen'傳遞給'sendto',如果'ipStr'實際上是一個'char *',那麼'ipLen = sizeof(ipStr)'或者沒有意義(如果sendto沒有使用)或者錯誤,不是嗎? –

+0

iplen是無意義的,但沒關係,因爲ipstr不應該在那裏。 –

相關問題