Tag: bsd

BSD操作系统上的原始套接字

我一直在用C编写一些套接字代码。我需要修改数据包头并控制它们的发送方式,所以我采用了原始套接字方法。 但是,我写的代码不能在BSD系统上编译(Mac OS X / Darwin,FreeBSD等) 我已经对此进行了大量研究,并发现BSD系统无法像Linux(甚至Windows)那样处理原始套接字。 从我读过的内容来看,似乎我需要使用bpf(berkley数据包filter),但我无法弄清楚bpf是如何工作的,或者我将如何使用原始套接字。 如果有人能对这一点有所了解,我会非常兴奋:D PS我甚至会对一些显示如何在BSD环境中处理原始套接字的源代码感到满意。 它不一定是指导或解释。 我只想看看它是如何工作的。

为什么sys / queue.h中的双向链表保持前一个下一个元素的地址?

我正在从FreeBSD学习sys/queue.h ,我有一个问题: 在sys/queue.h , LIST_ENTRY定义如下: #define LIST_ENTRY(type) \ struct { \ struct type *le_next; /* next element */ \ struct type **le_prev; /* address of previous next element */ \ } 为什么它保持前一个下一个元素的地址 ( struct type **le_prev )而不是像struct type *le_prev那样的前一个元素 ?

使用select()表示非阻塞套接字

我正在尝试使用select函数在服务器和1个客户端(不再)之间进行非阻塞i / o,其中通信流畅(可以随时发送而另一个将在不等待发送的情况下接收)。 我找到了一些包含一些代码的教程,并尝试将其改编为我的。 这就是我所拥有的 – 服务器 #define PORT “4950” #define STDIN 0 struct sockaddr name; void set_nonblock(int socket) { int flags; flags = fcntl(socket,F_GETFL,0); assert(flags != -1); fcntl(socket, F_SETFL, flags | O_NONBLOCK); } // get sockaddr, IPv4 or IPv6: void *get_in_addr(struct sockaddr *sa) { if (sa->sa_family == AF_INET) return &(((struct sockaddr_in*)sa)->sin_addr); return &(((struct sockaddr_in6*)sa)->sin6_addr); […]