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



我想知道…如果你创建一个函数,它有一个简单的套接字参数,你做你的基本指令内部的函数,如设置不同的选项套接字(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 %dn",
          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 %dn",
              errno);
          fflush(where);
          exit(1);
        }
    }

我知道通过传递指针到struct,int,char等,你可以在函数执行后修改值,没有指针的修改将只在该函数中保持局部,但它不会改变全局。

但是setsockopt函数呢?

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

f(1);

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

不能被f检测到。

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

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

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

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

对于setsockopt(),它将是:

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

相关内容

  • 没有找到相关文章

最新更新