如何解决非标量类型转换错误

时间:2019-05-13 02:25:11

标签: c pointers

我试图用C编写ICMP ping代码。

以下代码效果很好:

server {
    listen 80;

    server_name wagtaildev.wesgarlock.com;
    client_max_body_size 10000M;

    location = /favicon.ico { access_log off; log_not_found off; }

    location / {
        include proxy_params;
        proxy_pass http://unix:/home/wesgarlock/run/wagtaildev.sock;
    }
}

但是当我如下删除函数ping的参数时,编译失败。

int main(){ 
  struct sockaddr_in addr;
  hname = gethostbyname("192.168.1.5");
  bzero(&addr, sizeof(addr));
  addr.sin_addr.s_addr = *(long*)hname->h_addr;
  ping(&addr);
}
void ping(struct sockaddr_in *addr){    
   sendto(sd,&pckt,sizeof(pckt),0,(struct sockaddr*)addr,sizeof(*addr))
}

错误是:int main(){ ping(); } void ping(){ struct sockaddr_in addr; hname = gethostbyname("192.168.1.5"); bzero(&addr, sizeof(addr)); addr.sin_addr.s_addr = *(long*)hname->h_addr; sendto(sd,&pckt,sizeof(pckt),0,(struct sockaddr*)addr,sizeof(*addr)) } 当我在sendto()函数中删除*时,它仍然编译为错误:

error: invalid type argument of unary ‘*’ (have ‘struct sockaddr_in’)

btw,我在ping()函数中创建了struct sockaddr_in,因为我需要执行多个过程,并且需要避免多个进程共享同一结构。

2 个答案:

答案 0 :(得分:1)

为什么拥有

struct sockaddr_in *addr

在上方的一个作为参数

但是

struct sockaddr_in addr

失败了吗?

为什么不将addr定义为结构指针?

答案 1 :(得分:1)

指向“ struct sockaddr_in addr”的指针中存在错误。我做了其他一些修复。您必须是root用户才能运行此代码。

#include <string.h>
#include <stdio.h>
#include <netdb.h>
#include <unistd.h>
void ping(char *, int);
int main(){
    ping("data", 4);
}
void ping(char * pckt, int size){
    struct sockaddr_in addr;
    bzero(&addr, sizeof(addr));
    struct hostent * hname = gethostbyname("localhost");
    memcpy(&addr.sin_addr, hname->h_addr, hname->h_length);
    int sd = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
    if (sd >= 0) {
        if (sendto(sd,&pckt,size,0,(struct sockaddr*)&addr,sizeof(addr)) > 0) {
            printf("send ok\n");
        } else {
            printf("send error\n");
        }
    } else {
        printf("socket error\n");
    }
}