我已经实现了一个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;
}
答案 0 :(得分:1)
这里可能有一些原因:
该文件正在使用中 - 请参阅您的代码,将二进制文件转储到文件中,实际上fclose()
文件指针。
查看您是否对该文件具有读取权限,如果没有,请使用chmod
添加权限。
查看您是否拥有所有权,并且您是该文件的所有者。如果没有,请使用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>
”以获取文件的所有权。