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