2

我想知道...如果您创建一个具有简单套接字参数的函数,并且您在该函数中执行基本指令,例如为该套接字(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功能如何呢?

4

2 回答 2

1

setsockopt函数无法告诉您如何提出它的论点。因此,它不能采取不同的行动。无论你写:

f(1);

或者

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

无法被 f 检测到。

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

于 2015-09-19T13:58:34.923 回答
0

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

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

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

在这种情况下,setsockopt()它将是:

int `setsockopt()` setsockopt(int sockfd, int level, int optname,
                              const void *optval, socklen_t optlen);
于 2015-09-19T15:43:43.147 回答