小编dbr*_*nk0的帖子

如何在 Linux 上正确地将网络接口置于混杂模式

那么你如何正确地做到这一点呢?

我知道如何通过创建套接字,然后使用 ioctl 设置 IFF_PROMISC 标志(如“如何检查 C 中的网络设备状态? ”和其他地方所述),但这至少在理论上看起来有缺陷。

  1. 您通过 ioctl 读取标志
  2. 你更新标志
  3. 其他人修改了标志
  4. 您通过 ioctl 设置更新的标志

有没有更好的方法,还是我只是担心太多?

后来我发现应该通过setsockopt(也没有比赛)向PACKET_MR_PROMISC添加接口,如下所示:

void set_promisc(const char *ifname, bool enable)
{
    struct packet_mreq mreq = {0};
    int sfd;
    int action;

    if ((sfd = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL))) == -1) {
        perror("unable to open socket");
        return;
    }

    mreq.mr_ifindex = if_nametoindex(ifname);
    mreq.mr_type = PACKET_MR_PROMISC;

    if (mreq.mr_ifindex == 0) {
        perror("unable to get interface index");
        return;
    }

    if (enable)
        action = PACKET_ADD_MEMBERSHIP;
    else
        action = PACKET_DROP_MEMBERSHIP;

    if (setsockopt(sfd, …
Run Code Online (Sandbox Code Playgroud)

c linux network-programming

4
推荐指数
1
解决办法
4018
查看次数

pthread_cond_timedwait用于定期任务和挂钟更改

据我了解,pthread_cond_timedwait将通过获取当前时间来使用,然后计算pthread_cond_timedwait应该在没有信号的情况下退出的绝对时间.

有一种简单的方法可以使用此函数可靠地执行周期性任务(问题是在当前时间点和调用pthread_cond_timedwait之间的时间变化)?

我有一个应该每秒运行一次的周期性任务.

do {
    pthread_mutex_lock(mutex);
    tx = gettimeofday + 1 second;
    do_some_simple_periodic_task();
    pthread_cond_timedwait(condition, mutex, tx);
    pthread_mutex_unlock(mutex);
} while (!some_exit_condition);
Run Code Online (Sandbox Code Playgroud)

如果更新了上下文(包括some_exit_condition),则发出条件信号.

有没有办法使用单调计时器或类似的东西?如果没有,pthread_cond_timedwait的用例是什么?仅适用于您不关心延迟一小时的情况?

我已经看到了一个解决方案,其中另一个线程周期性地发出信号(如何使pthread_cond_timedwait()对系统时钟操作有效?),但它看起来像是一个黑客.

是否有一种不同的更好的方法让线程睡眠一段时间(不容易发生挂钟变化)但是立即对外部条件做出反应?

c pthreads

4
推荐指数
1
解决办法
698
查看次数

确定错误的原始原因

在C中是否有一些众所周知的嵌套错误处理模式/实践,比如Java中的嵌套异常?

使用通常的"只返回错误代码/成功"错误细节可能会丢失,然后程序才能确定它应该记录/报告错误.

想象一下类似于此的代码:

err B()
{
  if (read(a/b/c/U.user) != OK) {
    return read_error; //which would be eaccess or we could return even e_cannot_read_user
  }

  if (is_empty(read_user.name)) {
    // we could tell exactly what is missing here
    return einval;
  }
  ...
}

err A()
{
  if (B() != OK) {
    if (cannot_handle_B_failing()) {
      return e_could_not_do_b;
    }
  }
  ...
}

main()
{
  ...
  if (A() != OK) && (no_alternative_solution()) {
    report error_returned_by_A;
    wait_for_more_user_input();
  }
}
Run Code Online (Sandbox Code Playgroud)

有没有人在C中成功尝试某种嵌套错误代码/消息?可以报​​告(主要)用户名丢失或由于权限无效而无法读取文件F的事实.

有没有图书馆来支持这样的事情?

c error-handling

2
推荐指数
1
解决办法
231
查看次数

标签 统计

c ×3

error-handling ×1

linux ×1

network-programming ×1

pthreads ×1