1

ネットワークから raw パケットを受信して​​バイナリ ファイルに保存する C プログラムを実装しましたが、C はバイナリ ファイルを開くことができません。ターミナルを使用して開こうとしましたが、許可が拒否されました。バイナリ ファイルを開くにはどうすればよいですか?

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

     logfile=fopen("sniff_data.bin","wb");

     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)
      {
    //Print the error with proper message
        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);

        //Now process the packet
      ProcessPacket(buffer , data_size);
         }
       fclose(logfile);
       close(sock_raw);
       printf("\n");
       printf(" Finished\n\n");
       return 0;
  }
4

3 に答える 3

1

ここにはいくつかの理由が考えられます:

  1. ファイルは使用中です - バイナリをファイルにダンプしているコードで、実際にfclose()はファイル ポインタであることを確認してください。

  2. ファイルに対する読み取り権限があるかどうかを確認し、ない場合は、chmod権限を追加するために使用します。

  3. 所有権があるかどうか、およびあなたがファイルの所有者であることを確認してください。そうでない場合は、chown所有権をユーザー名に変更するために使用します。

于 2013-11-06T09:26:52.613 に答える
0

「ファイルを開く」とは?作成されたファイルが表示されますか? 一般に、ls -l <filename>ファイルに対して " " を実行し、そのサイズが 0 でないことを確認します。次に、パーミッションも確認します。おそらく、root/sudo として C プログラムを実行し、通常のユーザーとしてファイルを開こうとしていますか?

編集:「sudo」を使用してコマンドを実行したことをコメントで確認しました。これが、自分のユーザーとしてファイルを開くことができない理由です。" " を実行sudo chown <username> <filename>して、ファイルの所有権を取得してください。

于 2013-11-06T09:30:14.753 に答える