【问题标题】:Local socket option set vs pointer to socket option set本地套接字选项集与指向套接字选项集的指针
【发布时间】:2015-12-16 14:17:00
【问题描述】:

我想知道...如果您创建一个具有简单套接字参数的函数并在该函数内执行基本指令,例如为该套接字设置不同的选项 (setsockopt()) 并在函数存在之后,实际的区别是什么它仍然是选择吗?或者我应该将该参数指针指向该套接字,以保留套接字将发生的实际更改。

sctp_enable_events( int socket, int ev_mask )
{
    struct sctp_event_subscribe ev;

    bzero(&ev, sizeof(ev));

    if (ev_mask & SCTP_SNDRCV_INFO_EV)
    ev.sctp_data_io_event = 1;

    /*code */

    if (setsockopt(socket,
           IPPROTO_SCTP,
           SCTP_EVENTS,
           SCTP_SET_EVENTS,
           (const char*)&ev,
           sizeof(ev)) != 0 ) {
      fprintf(where,
          "sctp_enable_event: could not set sctp events errno %d\n",
          errno);
      fflush(where);
      exit(1);
    }
}

还是这样?

 sctp_enable_events( int *socket, int ev_mask, struct sctp_event_subscribe *ev )
    {

        if (ev_mask & SCTP_SNDRCV_INFO_EV)
        ev->sctp_data_io_event = 1;

        /*code */

        if (setsockopt(*socket,
               IPPROTO_SCTP,
               SCTP_EVENTS,
               SCTP_SET_EVENTS,
               ev,
               sizeof(*ev)) != 0 ) {
          fprintf(where,
              "sctp_enable_event: could not set sctp events errno %d\n",
              errno);
          fflush(where);
          exit(1);
        }
    }

我知道通过将指针传递给 struct、int、char 等,您可以在函数执行后修改值,如果没有指针,修改将仅在该函数中保持本地,但不会全局更改。

但是setsockopt 函数如何使用呢?

【问题讨论】:

    标签: c sockets pointers sctp setsockopt


    【解决方案1】:

    setsockopt 函数无法告诉您如何得出它的参数。因此,它不能采取不同的行动。是否写:

    f(1);
    

    int x = 1;
    int* xPtr = &x;
    f(*xPtr);
    

    f 无法检测到。

    这个问题真的和setsockopt无关。我建议您围绕指针和值加强您的 C 知识。如果没有这种理解,你会在 C 语言中犯很多错误。

    【讨论】:

    • 不!这个问题与 setsockopt() 有关。如果您调用函数 setsockopt() ,它将保留那些仅在本地可用的套接字的设置(在该函数中),还是会全局影响它?为了在全局范围内影响它,我应该像指针一样传递它还是应该像简单变量一样传递它?
    • 您无法选择是传入指针还是非指针。函数签名要求您传入一个指针。 setsockopt 将通过该指针访问内存。 setsockopt 无法判断该指针是指向局部变量还是其他东西。你明白吗?
    【解决方案2】:

    由于效率和您可能希望在不同的上下文中使用这些结构(通过取消引用指针),您通常应该将指针传递给结构。

    setsockopt()socket参数的情况下,它是一个int,所以它足够小,可以通过值传递(同样setsockopt()函数的签名需要int ,而不是指针)。

    对于setsockopt() 和其他C 系统API 函数,您应该查找它的声明/原型,并提供与原型所需类型完全相同的参数(必要时进行转换)。

    如果是setsockopt(),它将是:

    int `setsockopt()` setsockopt(int sockfd, int level, int optname,
                                  const void *optval, socklen_t optlen);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多