【问题标题】:recv() C error invalid conversion from char to intrecv() C 错误从 char 到 int 的无效转换
【发布时间】:2013-06-09 07:09:04
【问题描述】:

我在下面有一些 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)'

是什么导致了这些错误?

【问题讨论】:

    标签: c linux type-conversion recv


    【解决方案1】:

    这段代码有几个问题:

    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 编码的数字是您所期望的,您可以将 update 提供给 atoi

    奖励:使用sizeof(update) 而不是MAX_UPDATE_LEN 代替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);
    

    【讨论】:

    • 在做了一些小的调整并使用了 Atoi 之后,我也得到了它。谢谢
    • 如果您对答案感到满意,请将问题标记为“已回答”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-13
    • 2014-05-18
    • 2023-03-26
    相关资源
    最近更新 更多