1

我已经实现了一个 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 回答
1

假设您在 Linux 上并且二进制文件名为“file”。

首先,检查文件的权限:

ls -l file

如果您可以阅读它,权限应该看起来像这样:

-rw-r--r--

前三个字母是用户的权限,后三个是组,后三个是其他。如果有所有“r”(或者只是你需要的那些),那么你很高兴。

如果没有,您可以授予自己读取相关文件的权限:

chmod +r file

要实际读取文件,您可以尝试使用 vim 之类的编辑器或 cat 之类的命令:

cat -v file

(添加-vcat避免弄乱终端,在这种情况下您可以键入reset)。

这是在 C 中读取(和输出)文件的一种方法:

主.c

#include <stdio.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>

int main ()
{
  char *buffer;
  struct stat s;

  int fd = open ("file", O_RDONLY);
  if (fd < 0) {
    return EXIT_FAILURE;
  }
  fstat (fd, &s);

  buffer = mmap (0, s.st_size, PROT_READ, MAP_PRIVATE, fd, 0);
  if (buffer != (void *) -1) {
    fwrite (buffer, s.st_size, 1, stdout);
    munmap (buffer, s.st_size);
  }

  close (fd);
  return EXIT_SUCCESS;
}

(来自http://rosettacode.org/wiki/Read_entire_file#C的示例)

编译:

gcc -O2 main.c -o main

然后通过执行程序读取文件:

./main

要以二进制格式(1 和 0)查看文件,您可以使用以下命令:

xxd -b file
于 2013-11-06T09:37:13.053 回答
0

你是什​​么意思“打开文件”?你看到创建的文件了吗?一般来说,ls -l <filename>在你的文件上运行“”,看看它的大小不是0。然后还要检查权限。也许您已经以 root/sudo 身份运行 C 程序,现在尝试以普通用户身份打开文件?

编辑:我在您的评论中看到您使用“sudo”运行命令 - 这就是您无法以自己的用户身份打开文件的原因。运行“ sudo chown <username> <filename>”以获得文件的所有权。

于 2013-11-06T09:30:14.753 回答