1

我在下面有一些C代码:

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)'

是什么导致了这些错误?

4

1 回答 1

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通常比 a 大得多的 a 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_LENfor len- 这样如果类型声明或大小发生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);
于 2013-06-13T01:32:16.927 回答