0

これは、無差別モードでイーサネットから生のパケットを受信するための私のコードです。コンパイル中に、コード行に警告が表示されます

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");

 }
4

3 に答える 3

6

男2オープンから

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

Open は FILE * ではなく int (ファイル記述子) を返します。したがって、警告、およびコードが機能しない理由。

FILE * を int に変更し、fwrite と flcose の代わりに write(2) と close(2) を使用することをお勧めします。

または fopen(3) を使用します

于 2013-11-08T05:22:40.363 に答える
2

または fopen() を使用して FILE を返します *

于 2013-11-08T05:28:26.277 に答える
0

open()関数呼び出しはfile descriptor、どちらが int型であるかを返します。file streamしかし、タイプであるオープンな戻り値を割り当てていますFILE *

使用するときは、特定の記述子ではなく使用open()する必要がありますclose()fclose()

于 2013-11-08T05:23:11.503 に答える