如何打开使用C程序创建的二进制文件?

时间:2013-11-06 09:17:44

标签: c sockets binary

我已经实现了一个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;
  }

3 个答案:

答案 0 :(得分:1)

这里可能有一些原因:

  1. 该文件正在使用中 - 请参阅您的代码,将二进制文件转储到文件中,实际上fclose()文件指针。

  2. 查看您是否对该文件具有读取权限,如果没有,请使用chmod添加权限。

  3. 查看您是否拥有所有权,并且您是该文件的所有者。如果没有,请使用chown将所有权更改为您的用户名。

答案 1 :(得分:1)

假设您使用的是Linux,并且二进制文件名为“file”。

首先,检查文件的权限:

ls -l file

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

-rw-r--r--

前三个字母是用户的权限,组的下三个和其他三个。如果有所有“r”(或者只是你需要的那些),你就可以去了。

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

chmod +r file

要实际读取文件,您可以尝试像vim这样的编辑器或像cat这样的命令:

cat -v file

(将-v添加到cat以避免弄乱终端,在这种情况下,您可以输入reset)。

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

<强>的main.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

答案 2 :(得分:0)

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

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