Почему я получаю предупреждение о том, что присваивание делает указатель из целого числа без приведения?

Это мой код для получения необработанных пакетов из Ethernet в неразборчивом режиме. при компиляции я получаю предупреждение в строке кода

logfile=open("sniff_data.bin",O_CREAT|O_APPEND|O_TRUNC,0777);

Предупреждение: присваивание делает указатель целым без приведения [включено по умолчанию]. Я проверил в Google, но не смог найти решение. Может ли кто-нибудь сказать мне решение и где я ошибся?

void ProcessPacket(unsigned char* , int);
void print_ip_header(unsigned char* , int);
void print_tcp_packet(unsigned char * , int );
void print_udp_packet(unsigned char * , int );
void print_icmp_packet(unsigned char* , int );
void PrintData (unsigned char* , int);

FILE *logfile;
struct sockaddr_in source,dest;
int i,j;

int main()
{
    int saddr_size,data_size;
    struct sockaddr saddr;
    gopromiscous();
    unsigned char *buffer = (unsigned char *) malloc(1024);  

    logfile=open("sniff_data.bin",O_CREAT|O_APPEND|O_TRUNC,0777);  

    if(logfile==NULL)
    {
        printf("Unable to create sniff_data file.");
    }
    printf("\n Starting..\n");

    int sock_raw = socket( AF_PACKET , SOCK_RAW , htons(ETH_P_ALL)) ;
    setsockopt(sock_raw , SOL_SOCKET , SO_BINDTODEVICE , "eth0" , strlen("eth0")+ 1 );

    if(sock_raw < 0)
    {

        perror("Socket Error");
        return 1;
    }
    int count=30; 
    while(count>=0)
    { 
        count--;
        saddr_size = sizeof saddr;
        //Receive a packet
        data_size = recvfrom(sock_raw , buffer , 1024, 0 , &saddr , 
          (socklen_t*)&saddr_size);
        if(data_size <0 )
        {
            printf("Recvfrom error , failed to get packets\n");
            return 1;
        }

        fwrite(buffer, data_size, 1, logfile);    

    }

    fclose(logfile);
    close(sock_raw);
    printf("\n");
    printf(" Finished\n\n");
    return 0;
}


int gopromiscous()
  {

    int fd;
    struct ifreq eth;

    fd = socket(AF_INET, SOCK_PACKET, htons(0x800));

    strcpy(eth.ifr_name, "eth0");

    ioctl(fd, SIOCGIFFLAGS, &eth);

    eth.ifr_flags |= IFF_PROMISC;

    ioctl(fd, SIOCSIFFLAGS, &eth);

    printf("\n Entered Promiscuous Mode Successfully\n");

 }

person user2963407    schedule 08.11.2013    source источник
comment
Почему бы не прочитать страницу руководства?   -  person Ed Heal    schedule 08.11.2013
comment
потому что я пишу данные в сокет. Я имею в виду, что я включаю это как функцию в другую программу.   -  person user2963407    schedule 08.11.2013
comment
Функция openlinux.die.net/man/2/open — затем вы знать тип возвращаемого значения   -  person Ed Heal    schedule 08.11.2013
comment
я могу использовать это? logfile=fopen(sniff_data.bin,wb); будет ли он усекать все данные при повторном выполнении?   -  person user2963407    schedule 08.11.2013
comment
Если вы читали справочную страницу, то заметили, что open возвращает целое число, а не FILE *. Почему бы не прочитать linux.die.net/man/3/fopen и вообще этот флаг будет обрезать   -  person Ed Heal    schedule 08.11.2013


Ответы (3)


от человека 2 открыть

    int open(const char *path, int oflag, ...);

Open возвращает int (дескриптор файла), а не FILE *. Таким образом, предупреждение и причина, по которой ваш код не будет работать.

Возможно, вы захотите изменить FILE * на int и использовать write(2) и close(2) вместо fwrite и flcose.

Или используйте fopen(3)

person Antzi    schedule 08.11.2013
comment
я использую fwrite, потому что это двоичный файл! - person user2963407; 08.11.2013
comment
@ user2963407 open(2) также работает с двоичными файлами. Вам просто нужно быть осторожным, сохраняя размер файла и не ища '\ 0'. Размер возвращается read(2) - person Antzi; 08.11.2013
comment
@user2963407 user2963407 вы также можете использовать fopen(3), если хотите работать с ФАЙЛОМ * - person Antzi; 08.11.2013
comment
Наличие двоичного файла не обязывает вас использовать fwrite(). - person user207421; 08.11.2013

или используйте fopen() для возврата ФАЙЛА *

person Mark Hendrickson    schedule 08.11.2013
comment
но когда я использую fopen, я получаю предупреждение: передача аргумента 2 «fopen» делает указатель из целого числа без приведения [включено по умолчанию] - person user2963407; 08.11.2013
comment
@user2963407 user2963407 Покажите нам, как вы его используете. Я бы просто использовал fopen("sniff_data.bin",a+), если вы хотите добавить в конец файла. - person H_squared; 08.11.2013
comment
параметры fopen() отличаются от параметров open(). Но переключение fopen() меньше меняет ваш другой код. - person Mark Hendrickson; 08.11.2013

Вызов функции open() возвращает file descriptor типа int. но вы назначаете открытое возвращаемое значение для file stream, которое имеет тип FILE *.

когда вы используете open(), вы должны использовать close() с конкретным дескриптором, а не fclose()

person Gangadhar    schedule 08.11.2013
comment
да, вы пишете, но я использовал fwrite для записи данных, потому что это двоичный файл. - person user2963407; 08.11.2013
comment
затем используйте fopen(), чтобы открыть файл вместо open(), и верните строку файла (ФАЙЛ *). - person Gangadhar; 08.11.2013
comment
но когда я использую fopen, я получаю предупреждение: передача аргумента 2 «fopen» делает указатель из целого числа без приведения [включено по умолчанию] - person user2963407; 08.11.2013
comment
или я могу использовать этот файл журнала = fopen (sniff_data.bin, wb); - person user2963407; 08.11.2013
comment
Вы можете использовать и при использовании файла режима "w" or "wb" усекает все, если файл существует. - person Gangadhar; 08.11.2013