2013-06-13 29 views
1

下面我有一些C代碼:的recv()C錯誤的無效轉換成int

char update[MAX_UPDATE_LEN]; 
int remoteLen; 

char pholder; 
pholder = recv(update,connectDescriptor,MAX_UPDATE_LEN,MSG_DONTWAIT); //error 
remoteLen = atoi("pholder"); 

我不斷收到以下錯誤:

client.cpp:849: error: invalid conversion from `char*' to `int' 

client.cpp:849: error: initializing argument 1 of `ssize_t recv(int, void*, 
size_t, int)' 

client.cpp:849: error: invalid conversion from `int' to `void*' 

client.cpp:849: error: initializing argument 2 of `ssize_t recv(int, void*, 
size_t, int)' 

是什麼原因造成這些錯誤?

回答

2

有幾個問題與此代碼:

char update[MAX_UPDATE_LEN]; 
int remoteLen; 

char pholder; 
pholder = recv(update,connectDescriptor,MAX_UPDATE_LEN,MSG_DONTWAIT); <-- error here 
remoteLen = atoi("pholder"); 
  1. recv返回ssize_t這通常比char大得多。因此,您無法安全地將返回碼存儲在pholder中。
  2. recv()的參數錯誤順序。這是聲明:ssize_t recv(int sockfd, void *buf, size_t len, int flags);
  3. atoi正在傳遞一個字符串,它不是一個數字"pholder"。它期望像"12345"這樣的字符串。如果ASCII編碼數字是您所期望的,您可以給updateatoi

獎勵:使用sizeof(update)代替MAX_UPDATE_LENlen - 這樣,如果該類型聲明或update變化大小,你還是應該得到的預期值。

這裏是你會如何解決這個問題:

char update[MAX_UPDATE_LEN]; 

const int flags = MSG_DONTWAIT; 
const ssize_t ret = recv(connectDescriptor, update , sizeof(update), flags); 
if (-1 == ret) 
{ 
    perror("recv"); 
    exit(1); 
} 
const int remoteLen = strtol(update, update + sizeof(update), 0); 
+0

好吧後,我試圖執行的是有意義的。 – user2480498

+0

經過一些小的調整並使用Atoi後,我得到了它的工作。謝謝 – user2480498

+1

如果您對答案滿意,請將問題標記爲「已回答」 –