本地套接字选项集与指向套接字选项集的指针

时间:2015-09-19 13:31:59

标签: c sockets pointers sctp setsockopt

我想知道......如果您创建一个具有简单套接字参数的函数,并且您在该函数内部执行基本指令,例如为该套接字设置不同的选项(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函数?

2 个答案:

答案 0 :(得分:1)

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

f(1);

int x = 1;
int* xPtr = &x;
f(*xPtr);
f无法检测到

这个问题与setsockopt无关。我建议你加强你对指针和价值观的C知识。如果没有这种理解,你将在C中犯很多错误。

答案 1 :(得分:0)

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

对于socket的{​​{1}}参数,它是setsockopt(),因此它足够小,可以按值传递(也是{{1}的签名函数需要int,而不是指针。

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

int的情况下,它将是:

setsockopt()