Tag: linux

如何使用RAW套接字嗅探所有ICMP数据包

我正在学习RAW套接字。 在下面的代码中,我试图打印所有ICMP数据包标头信息。 看起来代码中有些错误。 任何人都可以帮助我,我错了。 # include # include # include # include # include # include # include main(){ int sockfd,retval,n; socklen_t clilen; struct sockaddr_in cliaddr, servaddr; char buf[10000]; sockfd = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP); if (sockfd < 0){ perror("sock:"); exit(1); } clilen = sizeof(struct sockaddr_in); while(1){ printf(" before recvfrom\n"); n=recvfrom(sockfd,buf,10000,0,(struct sockaddr *)&cliaddr,&clilen); printf(" rec'd %d […]

如何阻止C中的信号?

我正在尝试创建一个阻止信号SIGUSR1的程序,它会解锁信号。 在中间,我想看到使用sigpending阻止信号。 但它总是说信号没有被阻挡,我可以在信号被阻挡时使用它。 这是我的代码。 #include #include #include static void signals(int signaln) { switch (signaln) { case SIGUSR1: printf(“Signal SIGUSR1\n”); break; } return; } main() { sigset_t set,set2; struct sigaction sigs; sigs.sa_handler = signals; sigemptyset(&sigs.sa_mask); sigs.sa_flags=SA_ONESHOT; sigaction(SIGUSR1, &sigs,0); sigemptyset(&set); sigemptyset(&set2); sigaddset(&set,SIGUSR1); if(sigprocmask(SIG_BLOCK, &set, NULL)==0){ printf(“Blocking SISGUSR1…\n”); } sigpending(&set2); if (sigismember(&set2,SIGUSR1)==1) { printf(“The signal is blocked\n”); //it […]

如何在Windows / Linux C上检查CPU名称,型号,速度?

我想获得一些关于硬件的C信息: 我有多少CPU 每个核心有多少个核心 每个CPU中每个核心有多少个逻辑核心 CPU名称+型号 CPU速度+频率 CPU架构(x86,x64) 我知道在类似Linux的操作系统上我可以解析/proc/cpuinfo但由于它不是普通文件,我认为它不安全。 在SO上看到这个答案,但它并没有给我我需要的每一个信息。 我应该调用cat /proc/cpuinfo > file.txt然后解析file.txt吗? 我知道cpuid.h (我正在使用GCC)但是找不到关于这个标题的任何文档(无论如何 – 使用它是个好主意吗?)

在Linux中无法阻止从命名管道(FIFO)读取

我似乎无法完成这项工作,这很奇怪。 这是我的架构:我有一个命名管道,它将在一个始终运行的 root读取器进程和多个应用程序编写器进程之间进行通信。 当编写器nonblocking blocking时,读取器进程必须被blocking 。 因此,这是我在读者进程中所做的,它将以root权限运行。 reader.c #define PIPE_ID “/dev/shm/mypipe” // This function configures named pipe void configure_pipe() { // So that others can write umask(0000); if(mkfifo(PIPE_ID, S_IWUSR | S_IRUSR | S_IRGRP | S_IROTH | S_IWGRP | S_IWOTH) != 0) { perror(“mkfifo error\n”); } } 在主要function: int main (int argc, char **argv) { int […]

如何使用Linux中的RAW套接字发送802.11管理帧和dataframe

我正在尝试构建一个应用程序,它将使用原始套接字从用户空间发送802.11管理帧和dataframe。 我能够使用sendto()函数发送dataframe,但我也需要发送管理帧,我大部分都被卡住了。 有没有可行的方法呢?

从C列出Linux中的目录

我正在尝试使用来自c的linux api来模拟linux命令ls。 查看代码确实有意义,但是当我运行它时,我得到“stat error:没有这样的文件或目录”。 我检查过opendir工作正常。 我认为问题在于stat,即使我认为它应该返回0,它返回-1。 我错过了什么? 谢谢你的帮助。 #include #include #include #include #include #include int main(int argc, char *argv[]) { DIR *dirp; struct dirent *direntp; struct stat stat_buf; char *str; if (argc != 2) { fprintf( stderr, “Usage: %s dir_name\n”, argv[0]); exit(1); } if ((dirp = opendir( argv[1])) == NULL) { perror(argv[1]); exit(2); } while […]

我的线程图像生成应用程序如何将其数据传递给gui?

Mandelbrot生成器的慢速多精度实现。 螺纹,使用POSIX线程。 Gtk GUI。 我有点失落。 这是我编写线程程序的第一次尝试。 我实际上并没有尝试转换它的单线程版本,只是试图实现基本框架。 到目前为止它的工作原理的简要说明: Main创建了watch_render_start线程,该线程等待pthread_cond_signal,当点击“render”按钮时,由GUI回调发出信号。 watch_render_start检查图像是否已经渲染,检查退出等,但如果一切顺利,则会创建render_create_threads线程。 然后render_create_threads线程创建渲染线程,然后使用pthread_join等待它们完成(并使用get_time_of_day进行一些计时 – 在线程中是不是很糟糕?)。 渲染线程的入口点(富有想象力)称为渲染,循环,而next_line计算函数返回TRUE,以便处理更多行。 在这个while循环中,有检查停止或退出。 next_line func在递增变量之前获取要计算的行,以指示下一个要计算的线程的下一行。 如果要处理的线超出图像高度,则返回。 如果没有,则计算该行的内容。 然后递增lines_done并根据图像的高度进行检查,如果> =则返回0,如果<,则返回1。 这里有470多行代码,我相信你会很开心。 #include #include #include #include #include #include #include /* build with: gcc threaded_app.c -o threaded_app -Wall -pedantic -std=gnu99 -lgmp -lmpfr -pthread -D_REENTRANT -ggdb `pkg-config –cflags gtk+-2.0` `pkg-config –libs gtk+-2.0` */ typedef struct { struct […]

从sockaddr *转换为sockaddr_in *增加了所需的对齐

当我使用一些看起来像的代码时,编译器会产生这个警告。 …. for(p = res; p != NULL; p = p->ai_next) { void *addr; std::string ipVer = “IPv0”; if(p->ai_family == AF_INET) { ipVer = “IPv4”; struct sockaddr_in *ipv4 = (struct sockaddr_in *)p->ai_addr; addr = &(ipv4->sin_addr); } else { ipVer = “IPv6”; struct sockaddr_in6 *ipv6 = (struct sockaddr_in6 *)p->ai_addr; addr = &(ipv6->sin6_addr); } …. } 其中p […]

在alpine linux上编程段错误。 我该如何解决?

我一直在使用C / C ++ 编写一个 webrtc数据通道库,并用C 编写了一个程序 : 从同一进程创建两个对等体。 建立它们之间的联系。 如果连接成功,请关闭连接。 一切都在debian docker容器上正常运行,在我的主机上openuse tumbleweed(所有x86_64和64bit),但在alpine linux容器(64bit x86_64)上,我在子进程中得到一个SEGFAULT: 上面的函数来自程序的依赖“libnice”。 它似乎是* agent == NULL,并且在调用者的作用域中无法使其为null。 我甚至插入了一个printf(“Argument is %p”, agent); 在函数调用之前,它打印出它的内存,我可以validation它不是null。 从反汇编中,它看起来像复制代理的内容(0x557a1d20)作为被调用者堆栈中的局部变量的行导致段错误。 即使在make clean和重新编译之后,segfault也始终发生在此处。 激活记录失败? 堆栈腐败? 更新:我制作了一个更轻量级的容器并运行它,现在它在同一个priv_conn_keepalive_tick_unlocked中的不同位置进行了段priv_conn_keepalive_tick_unlocked 。 似乎设置了参数(注意0x7ffff7f9ad08): 由于我认为我可能会达到libmusl的默认堆栈限制80k,我使用getrlimit(RLIMIT_STACK, &rl)来获取堆栈大小,看起来它已经是8 MB而不是80k。 进一步增加此限制似乎没有任何区别,除非我分配超过8 MB,我的程序在Gdb 内部早期崩溃。 Gdb说它有一个未知的信号“??”; 在gdb之外,它在正常情况下崩溃,它通常在没有改变堆栈大小的情况下崩溃。 我不确定究竟是什么问题(堆栈损坏?)以及接下来要做什么来解决这个问题。 这是我的程序流程: 对于创建的每个对等体,使用fork()创建子进程 。 父子通信由ZeroMQ完成,我使用协议缓冲区将在子内部触发的任何回调(及其参数)转发到在父进程中运行的事件循环。 因此,对于上述程序,有2个子进程和1个父进程。 重现步骤: 源文件: https : //github.com/hamon-in/librtcdcpp/blob/alpine-test/examples/websocket_client/2in1.c 高山docker集装箱: https […]

并发I / O – 缓冲损坏,阻止设备驱动程序

我开发块分层设备驱动程序。 因此,我拦截WRITE请求并加密数据,并在end_bio()例程中解密数据(在处理和READ请求期间)。 所以一切都在单流中正常工作。 但是如果尝试同时从两个或多个进程执行I / O,我会得到缓冲区内容损坏。 我没有缓冲区的本地存储空间。 我是否需要在我的驱动程序中计算BIO合并? Linux I / O子系统是否有一些与并发I / O请求相关的要求? 是否有一些与堆栈使用或编译相关的技巧和窍门? 这是在内核4.15下。 当时我使用下一个收缩来运行磁盘扇区: /* * A portion of the bio_copy_data() … */ for (vcnt = 0, src_iter = src->bi_iter; ; vcnt++) { if ( !src_iter.bi_size) { if ( !(src = src->bi_next) ) break; src_iter = src->bi_iter; } src_bv = bio_iter_iovec(src, src_iter); […]