Как я могу исправить ошибку преобразования не скалярного типа - PullRequest
0 голосов
/ 13 мая 2019

Я пытался написать код проверки ICMP на C.

Следующий код работает очень хорошо:

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

Но когда я удалил параметр функции ping следующим образом, компиляция не удалась.

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

Ошибка была: error: invalid type argument of unary ‘*’ (have ‘struct sockaddr_in’) Когда я удалил функцию * в sendto (), она по-прежнему компилировала ошибку как:

error: conversion to non-scalar type requested

Кстати, я создал struct sockaddr_in в функции ping (), потому что мне нужно выполнять несколько процессов и избегать использования одной и той же структуры несколькими процессами.

Ответы [ 2 ]

1 голос
/ 13 мая 2019

Произошла ошибка в указателе на "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");
    }
}
1 голос
/ 13 мая 2019

Почему у вас есть

struct sockaddr_in *addr

в верхнем как аргумент

но

struct sockaddr_in addr

в неудачном?

почему бы не определить addr как указатель структуры?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...