2013-06-13 19 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

如果您对答案满意,请将问题标记为“已回答” –